Tshumore Ответов: 1

Как устранить ошибку "не удается неявно преобразовать тип "строка" в строку[]


У меня есть форма, в которой мне нужно сделать выбор нескольких сотрудников на HtmlDropDownFor. Я использовал SelectListItem и в моем контроллере я получаю исключение 'Невозможно неявно преобразовать тип 'string' в string[] ' на имущество, принадлежащее сотруднику, то есть на линии


request.EmployeeNumber = Convert.ToString(formcollection["EmployeeNumber"]);


У меня также есть соответствующее исключение "Невозможно неявно преобразовать тип 'string[]' в 'string" о функции, которая загружает отдельного сотрудника в модель, т. е.

Вот как я получаю сотрудников :
private static IEnumerable<SelectListItem> GetEmployees()
       {
           string department = string.Empty;
           department = System.Web.HttpContext.Current.Session["Department"].ToString();

           string number = string.Empty;
           number = System.Web.HttpContext.Current.Session["UserId"].ToString();

           List<SelectListItem> employees = new List<SelectListItem>();
           using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
           {

               SqlCommand cmd = new SqlCommand("SELECT DisplayName,EmployeeNumber FROM Users WHERE Active=" + Convert.ToInt32(Helpers.parameters.active) + " AND Department=" + Convert.ToInt32(department) + "", conn);

               conn.Open();
               SqlDataReader dr = cmd.ExecuteReader();
               while (dr.Read())
               {
                   employees.Add(new SelectListItem
                   {
                       Text = dr["DisplayName"].ToString(),
                       Value = dr["EmployeeNumber"].ToString()
                   });
               }
               conn.Close();
           }

           return employees;
       }


В модели OverTimeRequest.cs у меня есть :
[Required]
        [Display(Name = "Employee ")]
        public string[] EmployeeNumber { get; set; }
        public Employee Employee { get; set; }
        public String DisplayName { get; set; }
		public IEnumerable<SelectListItem> employees { get; set; }




Контроллер :
[HttpPost]
       public ActionResult NewOverTimeRequest(FormCollection formcollection)
       {

           Models.Employee.OverTimeRequest request = new Models.Employee.OverTimeRequest();
           try
           {

               var batch = new OvertimeBatch();
               batch.AppliedBy = Convert.ToString(Session["UserId"]);
               batch.Justification = Convert.ToString(formcollection["Justification"]);
               batch.rate = Convert.ToInt32(formcollection["RateId"]);
               batch.NumberOfHour = Convert.ToInt32(formcollection["Hours"]);
               batch.Month = Convert.ToDateTime(formcollection["PayMonth"]);
               batch.AppliedOn = DateTime.Now;
               batch.id = batch.save();

               request.employees = GetEmployees();
               request.Rates = PopulateOverTimeRates();

               request.EmployeeNumber = Convert.ToString(formcollection["EmployeeNumber"]);
               request.RateId = Convert.ToInt32(formcollection["RateId"]);
               request.Justification = Convert.ToString(formcollection["Justification"]);
               request.Hours = Convert.ToInt32(formcollection["Hours"]);
               request.PayMonth = Convert.ToDateTime(formcollection["PayMonth"]);
               request.AppliedBy = Convert.ToString(Session["UserId"]);
               request.AppliedOn = DateTime.Now;

               DateTime Today = request.PayMonth;
               var startdate = new DateTime(Today.Year, Today.Month, 1);
               request.PayMonth = startdate.AddMonths(1).AddDays(-1);

               PayRunController payrun = new PayRunController();

               var employees = request.EmployeeNumber.Split(',');


               request.OverTimeAmount = 0.00;

               double total = 0.0;
               if (ModelState.IsValid)
               {
                   foreach (var employee in employees)
                   {
                      // request.OverTimeAmount = payrun.CalculateOverTimeAmount(employee, request.RateId);
                       total += request.OverTimeAmount;

                       using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
                       {

                           SqlCommand cmd = new SqlCommand("SubmitOverTimeRequest", conn);
                           cmd.CommandType = CommandType.StoredProcedure;


                           cmd.Parameters.AddWithValue("@EmployeeNumber", employee);
                           cmd.Parameters.AddWithValue("@OverTimeRate", request.RateId);
                           cmd.Parameters.AddWithValue("@Justification", request.Justification);
                           cmd.Parameters.AddWithValue("@NumberOfHours", request.Hours);
                           cmd.Parameters.AddWithValue("@PayMonth", request.PayMonth);
                           cmd.Parameters.AddWithValue("@Amount", request.OverTimeAmount);
                           cmd.Parameters.AddWithValue("@AppliedBy", request.AppliedBy);
                           cmd.Parameters.AddWithValue("@AppliedOn", request.AppliedOn);
                           cmd.Parameters.AddWithValue("@OverTimeBatch", batch.id);

                           conn.Open();
                           cmd.ExecuteNonQuery();

                       }

                   }
                   batch.TotalAmount = total;
                   batch.updateTotalAmount();

                   return RedirectToAction("OverTime");
               }

           }

           catch (Exception ex)
           {
               ViewBag.ErrorMessage = ex.Message;
               return View(request);
           }

           return RedirectToAction("OverTime");
       }


Вот как я получаю данные в представлении NewOverTimeRequest.cshtml :


@Html.DropDownListFor(m => m.EmployeeNumber, Model.employees, "Please Select", htmlAttributes: new { @class = "form-control" })
                                                               @Html.ValidationMessageFor(model => model.EmployeeName, "", new { @class = "text-danger" })


Любой, у кого есть идеи о том, как я могу правильно реализовать эту функциональность.

Что я уже пробовал:

Я искал источники и предложения, указывающие на то, что я должен использовать диапазон в функции GetEmployees. Кроме того, я попытался использовать forech в представлении, как показано ниже, но он не работает, так как пример im using не использует элемент select, а скорее HtmlDropDownFor/Html.ListBoxFor


m.EmployeeNumber, Model.employees, "Please Select", htmlAttributes: new { @class = "form-control" })
                                                               @Html.ValidationMessageFor(model => model.EmployeeName, "", new { @class = "text-danger" })>


Я следую за ответом Из этой темы asp.net mvc 3 - Как правильно создать Мультиселект <select> с помощью помощника DropdownList? - переполнение стека[^]

0x01AA

Вы decalred public string[] EmployeeNumber { get; set; } таким образом, EmployeeNumber-это массив...

1 Ответов

Рейтинг:
10

MadMyche

Причина, по которой вы получаете эту ошибку, заключается в том, что EmployeeNumber объявляется как массив строк (string[]) и вы пытаетесь заполнить его непосредственно из одной строки.

Я полагаю, что вы хотите, чтобы это была просто строка, а не массив из них.OverTimeRequest.в CS

[Required]
[Display(Name = "Employee ")]
public string[] EmployeeNumber { get; set; }
//           ^^ you probably want a string, not a string[] which would be an array

public Employee Employee { get; set; }
public String DisplayName { get; set; }
public IEnumerable<SelectListItem> employees { get; set; }

Если бы вы действительно хотели, чтобы это был массив, то вы бы заполнили его следующим образом
EmployeeNumber = new string[] { Convert.ToString(formcollection["EmployeeNumber"]) };


Tshumore

@MadMyche. Я хочу, чтобы EmployeeNumber был массивом , это заявка на сверхурочную работу для нескольких сотрудников, поэтому я использовал ListBoxFor. в контроллере у меня есть var employees = request.EmployeeNumber.Split(','); который затем извлекает выбранных сотрудников.

Я внес поправки в кодекс, чтобы иметь :
request.EmployeeNumber = новая строка[] { Convert.ToString(formcollection["EmployeeNumber"]) };

но я получаю исключение Аргумент 1: не удается конвертировать из 'системы.Коллекции.Общий.IEnumerable<string> to string для объекта employee в строке
foreach (var employee in employees)
{
запрос.OverTimeAmount = payrun.CalculateOverTimeAmount(сотрудник, запрос.RateId); //сотрудник

Что я делаю не так?