Как устранить ошибку "не удается неявно преобразовать тип "строка" в строку[]
У меня есть форма, в которой мне нужно сделать выбор нескольких сотрудников на 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-это массив...