在DropDownListFor问题上的验证ModelState.IsValid始终为false

问题描述

|| 我在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键中...错误是:“名称”字段为必填项 有什么办法可以解决这个问题?怎么样? 谢谢     

解决方法

您已经在
Name
属性上放置了必填属性,但是该属性从未发送到服务器,因此您的模型无效(仅
Id
被发布)。因此,应将其放在
Id
属性上:
public class Role 
{        
    [Required(ErrorMessage = \"Required.\")]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}
同样,您应该将此“ 5”属性设为“ 9”,因为您为下拉菜单定义了一个空值,如果用户未选择任何值,它将崩溃。因此,您的模型应如下所示:
public class Role 
{        
    [Required(ErrorMessage = \"Required.\")]
    public virtual int? Id { get; set; }
    public virtual string Name { get; set; }
}
您也可以从User类的Role属性中删除Required属性。不需要。 最终建议,也许也是最重要的建议:用视图模型上的一个属性替换此ѭ11ug丑陋的外观,以使助手如下所示:
@Html.DropDownListFor(
    model => model.Role.Id,Model.Roles,\"-- Select --\",new { @class = \"form radius\" }
)
    ,我也遇到了这种错误。 也许解决您问题的方法是在您的Edit.cshtml视图中放置如下代码: @ Html.HiddenFor(model => model.Id)     ,模型
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
    }
}
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...