我有一个SQL Server 2012,其中我有AWARD表,有两列TITLE和MONTH。 TITLE是varchar(256),不能为NULL。 MONTH是int,可以是NULL。
使用VS2012 Ultimate和EF 5.0.0,MVC4应用程序中的TextBoxFor助手不会为上面的TITLE列产生验证(data-val="required" and data-val-required="required message")
,但在同一个View中,MONTH正在获得正确的验证标记。 .edmx设计器确实显示TITLE是NonNullable,BUTT,自动生成的AWARD.cs文件没有[Required]
TITLE列的属性。
我可以尝试什么?
@model MyProject.Models.AWARD
@{
ViewBag.Title = "Add Award";
Layout = "~/Views/Shared/_EditorLayout.cshtml";
}
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Add Award</legend>
<table>
<tr>
<td>
@Html.LabelFor(model => model.TITLE)
</td>
<td>
@Html.TextAreaFor(model => model.TITLE)
<br />@Html.ValidationMessageFor(model => model.TITLE)
</td>
</tr>
<tr>
<td>
@Html.LabelFor(model => model.MONTH)
</td>
<td>@Html.DropDownListFor(model => model.MONTH, new SelectList(MyProject.Models.Helpers.Months, "key","value"), "[Not Selected]")
<br />@Html.ValidationMessageFor(model => model.MONTH)
</td>
</tr>
<tr>
<td>
<input type="submit" value="Add" />
</td>
<td>
@Html.ActionLink("Cancel", "Index", null, new { @class = "cancel-button" })</td>
</tr>
</table>
</fieldset>
}
答案 0 :(得分:4)
您不应该将视图直接绑定到数据映射实体。您应该创建视图模型类来包装传递给视图的数据,然后从控制器中填充数据对象。
然后,您可以在视图模型上执行所需的验证,而不会影响生成的映射类。
<强>模型强>
public class AwardViewModel
{
[Required, StringLength(30)]
public string Title { get; set; }
....
}
查看强>
@model AwardViewModel
@using (Html.BeginForm()) {
@Html.EditorFor(m => m.Title)
@Html.ValidationMessageFor(m => m.Title)
...
}
<强>控制器强>
[HttpPost]
public ActionResult Create (AwardViewModel model)
{
/* Create new AWARD in entity context, populate
with relevant fields from model and commit. */
}