TextBoxFor()不生成验证标记

时间:2013-01-25 22:56:53

标签: c# .net asp.net-mvc-4 entity-framework-5

我有一个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>
}

1 个答案:

答案 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. */
}