Я заполняю DropDownList из данных в памяти и получаю эту ошибку на POST.Элемент ViewData с ключом «Позиция» имеет тип «System.String», но должен иметь тип «IEnumerable <SelectListItem>»
Элемент ViewData, имеющий ключ «Позиция», имеет тип «System.String», но должен иметь тип «IEnumerable».
Модель:
public class StaffModel
{
public int id { get; set; }
public string Email { get; set; }
[DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.Password)]
public string PasswordConfirm { get; set; }
public string Emp_Name { get; set; }
public string Emp_Address { get; set; }
public string Phone { get; set; }
public string Position { get; set; }
public List<SelectListItem> Positions { set; get; }
}
Контроллер:
public ActionResult Register()
{
IEnumerable<SelectListItem> position = db.Positions.Select(p => new SelectListItem
{
Text = p.Position_Title,
Value = p.Position_ID.ToString()
});
ViewBag.Position = position;
return View();
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(StaffModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
Employee em = new Employee
{
Employee_Name = model.Emp_Name,
Address = model.Emp_Address,
Phone = model.Phone,
Position_ID = Convert.ToInt32(db.Positions.Where(p => p.Position_Title == model.Position).Select(p => p.Position_ID)),
};
db.Employees.Add(em);
db.SaveChanges();
return RedirectToAction("Index", "Employees");
}
}
return View(model);
}
enter code here
HTML/Razor:
<div class="form-group">
@Html.LabelFor(model => model.Position, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("Position",null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Position, "", new { @class = "text-danger" })
</div>
</div>
Извиняюсь, Я перепробовал, что это происходит на почте .. вы должны объявить 'ViewBag.Position' как в методах действий HttpGet' и' HttpPost', скорее всего, выше вашего оператора 'if' –
. Я также запутался в вашем .Where statement .. 'p.Position_Title' никогда не должен совпадать с' model.Position', потому что 'model.Position' будет ** значением ** выпадающего списка .. не текст .. так что в основном ваше высказывание' .Where (p => p.Position_Title == p.Position_ID.ToString()) ' –
@BviLLe_Kid, как я могу это исправить? – bao4461826