1

TITLEとMONTHの2つの列を持つAWARDテーブルがあるSQL Server 2012があります。TITLE は varchar(256) であり、NULL にすることはできません。MONTH は int で、NULL にすることができます。

VS2012 Ultimate と EF 5.0.0 では、MVC4 アプリの TextBoxFor ヘルパーは (data-val="required" and data-val-required="required message")上記の TITLE 列の検証を生成しませんが、同じビューで MONTH は正しい検証マークアップを取得しています。.edmx デザイナーは、TITLE が NonNullable であることを示していますが、自動生成された 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>
}
4

1 に答える 1

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. */
}
于 2013-01-25T23:17:50.910 に答える