验证DropDownListFor问题(ModelState.IsValid总是false)

Pau*_*aul 0 validation asp.net-mvc-3

我在DropDownListFor上使用验证时遇到问题...

我的型号:

public class User 
{
    ...
    public virtual int Id{ get; set; }
    [Required(ErrorMessage = "Required.")]
    public virtual Role Role { get; set; }
}

public class Role 
{        
    public virtual int Id{ get; set; }
    [Required(ErrorMessage = "Required.")]
    public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器:

    public ActionResult Edit()
    {
        ViewBag.Roles = new SelectList(new Repository<Role>().GetAll(), "Id", "Name");

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

我的编辑视图(强类型)

   @model User
   ...
   @Html.LabelFor(model => model.Role)
   @Html.DropDownListFor(model => model.Role.Id, ViewBag.Roles as SelectList, "-- Select --",new { @class = "form radius" })
   @Html.ValidationMessageFor(model => model.Role)
Run Code Online (Sandbox Code Playgroud)

一切都很好,当我尝试保存用户模型时,问题就解决了:

    [HttpPost]
    public ActionResult Edit(User user)
    {
        if (ModelState.IsValid)
        ...
    }
Run Code Online (Sandbox Code Playgroud)

ModelState.IsValid始终为false ...在ModelState内部查看,错误在Role.Name键中...错误是:Name字段是必需的

有没有办法解决这个问题?怎么样?

谢谢

Dar*_*rov 5

您已在属性上放置了必需属性,Name但从未将其发送到服务器,因此您的模型无效(仅限IdPOST).所以你应该把它放在Id财产上:

public class Role 
{        
    [Required(ErrorMessage = "Required.")]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

此外,您应该创建此Id属性,Nullable因为您为下拉列表定义了一个空值,如果用户没有选择任何值,它将崩溃.所以你的模型应该是这样的:

public class Role 
{        
    [Required(ErrorMessage = "Required.")]
    public virtual int? Id { get; set; }
    public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您还可以从User类的Role属性中删除Required属性.这不是必需的.

最后的建议,可能是最重要的建议:用ViewBag你的视图模型中的属性替换这个丑陋,以便帮助器看起来像这样:

@Html.DropDownListFor(
    model => model.Role.Id, 
    Model.Roles, 
    "-- Select --",
    new { @class = "form radius" }
)
Run Code Online (Sandbox Code Playgroud)

  • @Paul,您定义的类只包含给定视图所需的属性,并且您的控制器操作将此视图模型作为参数.它将包含相应的验证属性.因此,如果此视图中没有Name,则`EditUserViewModel`中将没有Name属性.事实上,您正试图在不同的情况下重复使用您的模型,这会导致您头痛.不要将此"用户"模型放在所有操作中,因为验证规则会有所不同.定义视图模型,然后在视图模型和模型之间进行映射. (3认同)