当Dropdownlist在ViewModel上时,ModelState始终无效

时间:2013-10-17 18:55:07

标签: c# asp.net asp.net-mvc

我有这个ViewModel:

public class CreateUserModel {
  public int StateId { get; set; }
  public IEnumerable<SelectListItem> States { get; set; }
}

这是我的观点:

@Html.DropDownListFor(model => model.StateId, Model.States, "--select state--")

这是我的控制器:

public ActionResult Create()
{
    var model= new CreateUserModel();
    model.States = new SelectList(_context.States.ToList(), "Id", "Name");
    return View(model);
}

[HttpPost]
public ActionResult Create(CreateUserModel model)
{
    if (ModelState.IsValid)
    {
        _context.Users.Add(new User()
        {
          StateId = model.StateId
        });
        _context.SaveChanges();
        return RedirectToAction("Index");
    }
    else
    {
        return View(model);
    }
}

此错误使ModelState无效:

  

System.InvalidOperationException:从类型转换参数   'System.String'键入'System.Web.Mvc.SelectListItem'失败,因为   没有类型转换器可以在这些类型之间进行转换。


已修改为包含我的完整视图

@model AgreementsAndAwardsDB.ViewModels.CreateUserModel

    <!DOCTYPE html>
    <html>
    <head>

        <script src="~/Scripts/jquery-1.8.3.min.js"></script>
        <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
        <script src="~/Scripts/jquery.validate.min.js"></script>
       </head>
    <body class="createPage">
        @using (Html.BeginForm("Create", "Accounts", Model, FormMethod.Post))
        {
            @Html.DropDownList("StateId", Model.States)
            <input type="submit" />
        }
    </body>
    </html>

1 个答案:

答案 0 :(得分:3)

您使用以下行将模型作为路径值传递给表单操作:

@using (Html.BeginForm("Create", "Accounts", Model, FormMethod.Post))

由于IEnumerable<SelectListItem> States无法以良好的方式解析查询字符串,因此表单操作将为Accounts/Create?StateId=0&States=System.Web.Mvc.SelectList,模型绑定器将尝试绑定字符串“System.Web”。 Mvc.SelectList“IEnumerable<>,这就是你的代码不起作用的原因。

你可能只是

@using (Html.BeginForm())

,但如果你想指定行动,那么控制器和方法就是

@using (Html.BeginForm("Create", "Accounts", FormMethod.Post))