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

时间:2011-04-13 19:35:05

标签: 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; }
}

我的控制器:

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

        return View();
    }

我的编辑视图(强类型)

   @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)

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

    [HttpPost]
    public ActionResult Edit(User user)
    {
        if (ModelState.IsValid)
        ...
    }

ModelState.IsValid始终为false ...在ModelState内部,错误位于 Role.Name 键...错误是:名称字段是必需的< /强>

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

由于

3 个答案:

答案 0 :(得分:5)

您已在Name属性上放置了必需属性,但这绝不会发送到服务器,因此您的模型无效(仅Id已发布)。所以你应该把它放在Id属性上:

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

此外,您应该创建此Id属性Nullable,因为您已为下拉列表定义了空值,如果用户未选择任何值,则会崩溃。所以你的模型应该是这样的:

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

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

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

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

答案 1 :(得分:1)

我也遇到过这种错误。

也许解决问题的方法是在Edit.cshtml视图中放置这样的代码:

@ Html.HiddenFor(model =&gt; model.Id)

答案 2 :(得分:0)

模型

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

查看

@Html.DropDownListFor(m => m.Role.Id, (SelectList)ViewBag.gRoles, "-- Select --")
@Html.ValidationMessageFor(m => m.Role.Id)

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Creedit(User x)
{
    x.Role = db.RoseSet.Find(x.Role.Id);
    if (x.Role != null)
    {
        ModelState["Role.Name"].Errors.Clear();

    }

    if (ModelState.IsValid)
    {
      // proceed
    }
    else
    {
      // return validation error
    }
}