2011-04-13 50 views
0

使用上DropDownListFor验证有问题...... I'm验证上DropDownListFor问题(ModelState.IsValid始终为false)

我的模型:

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总是假的... ...展望的ModelState里面,误差值在Role.Name键...错误是:名称字段是必需的

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

感谢

回答

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" } 
) 
+0

问题是我有一个角色UI,用户可以注册新的角色......并且需要名称是必需的,除了我的Id属性属于EntityBase类... – Paul 2011-04-13 19:44:28

+0

@Paul然后确保您的表单上有一个名称输入字段,并且发送值或您的模型永远不会有效。如果没有名称字段,则使用视图模型。事实上,不应该,你应该总是使用视图模型:-) – 2011-04-13 19:45:25

+0

是的,这就是我想要做的,但我不知道如何:( – Paul 2011-04-13 19:47:36

1

我也遇到这样那样的错误。

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

@ Html.HiddenFor(型号=> model.Id)

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 
    } 
}