我在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 键...错误是:名称字段是必需的< /强>
有没有办法解决这个问题?怎么样?
由于
答案 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
}
}