2017-02-17 13 views
0

Я заполняю 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> 
+0

Извиняюсь, Я перепробовал, что это происходит на почте .. вы должны объявить 'ViewBag.Position' как в методах действий HttpGet' и' HttpPost', скорее всего, выше вашего оператора 'if' –

+0

. Я также запутался в вашем .Where statement .. 'p.Position_Title' никогда не должен совпадать с' model.Position', потому что 'model.Position' будет ** значением ** выпадающего списка .. не текст .. так что в основном ваше высказывание' .Where (p => p.Position_Title == p.Position_ID.ToString()) ' –

+0

@BviLLe_Kid, как я могу это исправить? – bao4461826

ответ

0

Ваша привязка в выпадающем списке выглядит неправильно.

В вашей модели содержатся позиции, которые являются данными для вашего раскрывающегося списка. У вас также есть «позиция», которую я предполагаю, это строка, которая будет привязана к выбранному значению в раскрывающемся списке.

Изменить вид на

@Html.DropDownListFor(x=> x.Position, Model.Positions, new {@class = "form-control"})) 

Тогда на ваш пост, это выглядит так, как будто вы пытаетесь получить значение, выбранное из выпадающего списка путем выполнения запроса Linq на «позиции» списка модели который использовался для заполнения раскрывающегося списка. Теперь вы должны иметь выбранное значение в свойстве «Позиция» вашей модели.

Таким образом, вы должны сказать

Position_ID = model.Position 

Я бы также использовать модель для регистр View. Что-то вроде ...

public class RegisterViewModel 
     { 
      public IEnumerable<SelectListItem> Positions { get; set; } 
      public string Position { get; set; } 
     } 

Плюс дополнительные поля, которые необходимо.

В вашем методе действия Register заполните модель представления и верните представление.

public ActionResult Register() 
     { 
      var regModel = new RegisterViewModel 
      { 
       Positions = db.Positions.Select(p => new SelectListItem 
       { 
        Text = p.Position_Title, 
        Value = p.Position_ID.ToString() 
       }) 
      }; 

      return View("Register",regModel); 
     } 

Теперь вам не нужно использовать ViewBag.

Надеюсь, что поможет

+0

все еще не работает – bao4461826

+0

Я только что отредактировал ответ. Посмотрите, как вы справляетесь. – Wheels73

+0

'Position_ID = model.Position' неправильный тип – bao4461826

0

он работает правильно.спасибо всем мне помочь: D

Модель:

public class StaffModel 
{ 
    public string Position { get; set; } 
    public List<Position> Positions { set; get; } 
    public int selectID { get; set; } 

} 

Контроллер:

public ActionResult Register() 
    { 
     StaffModel st = new StaffModel(); 
     st.Positions = db.Positions.ToList(); 
     return View(st); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(StaffModel model) 
    {   
     if (ModelState.IsValid) 
     { 

      var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
      var result = UserManager.Create(user, model.Password); 
      if (result.Succeeded) 
      { 
       Employee em = new Employee 
       { 
        Employee_Name = model.Emp_Name, 
        Address = model.Emp_Address, 
        Phone = model.Phone, 
        Position_ID = model.selectID, 
        ID_User = user.Id 
       }; 
       db.Employees.Add(em); 
       db.SaveChanges(); 

       return RedirectToAction("Index", "Employees"); 
      } 

      else 
       AddErrors(result); 
     } 
     ViewBag.Position = new SelectList(db.Positions, "Position_ID", "Position_Title"); 
     return View(model); 
    } 

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.DropDownListFor(model=>model.selectID,new SelectList(Model.Positions, "Position_ID", "Position_Title"), htmlAttributes: new { @class = "form-control" }) 
      @Html.ValidationMessageFor(model => model.Position, "", new { @class = "text-danger" }) 
     </div> 
    </div>