0

このページを開くと (初めてでも) 常に検証メッセージが表示されます。ドロップダウン リストのいずれかで値を選択しても、メッセージは消えません。両方の値を選択すると、フォームを送信できますが、メッセージは消えません。

SnippetLinq to SQLクラスでLanguageIDありSnippetTypeID、intです。これは、空のモデルをViewに渡すためLanguageIDSnippetTypeIDnullであり、AFAIK Linq to Sqlクラスがnull不可のintで必要であるために発生すると想定しています。

ユーザーがフォームを送信しようとする前に検証メッセージが表示されないように、またドロップダウン リストの 1 つが選択されて検証メッセージが削除されるようにするにはどうすればよいですか。

意見

@model Data.Snippet
@using (Html.BeginForm("Save", "Submit", FormMethod.Post))
{
    <h1 class="subtitle">Submit new snippet</h1>

    <h4>Title</h4>

    @Html.TextBoxFor(snippet => snippet.Title, new { @class = "form-field" })

    <h4>Language</h4>

    @Html.DropDownListFor(snippet => snippet.LanguageID, new SelectList(@ViewBag.Input.Languages, "ID", "Name", @Model.LanguageID), "Choose Language", new { @class = "form-select" })

    <p>@Html.ValidationMessageFor(snippet => snippet.LanguageID , "You must choose language", new { @class= "validation-message"})</p> 

    <h4>Snipet type</h4>

     @Html.DropDownListFor(snippet => snippet.SnippetTypeID, new SelectList(@ViewBag.Input.SnippetTypes, "ID", "Name", @Model.SnippetType), "Choose snippet type", new { @class = "form-select" })

     <p>@Html.ValidationMessageFor(snippet => snippet.SnippetTypeID,"You must choose snippet type", new { @class= "validation-message"})</p> 

     <h4>Text</h4>

     @Html.TextAreaFor(snippet => snippet.Text, new { cols = "20", rows = "10", @class = "form-field" })

     <input type="submit" value="Submit Snippet" />
}

コントローラ

        //Controllers are not finished Save() should have
        //code to actually insert to db after I fix validation
        // GET: /Submit/
        //
        public ActionResult Index()
        {
            Snippet model = new Snippet();

            SubmitModel input = new SubmitModel();

            ViewBag.Input = input;

            return View(model);
        }

        public ActionResult Save(Snippet snippet)
        {

            return View();
        }

モデル

モデルはLinq to Sqlクラスです。

Snippet
ID (int, identifier)
Title (string)
SnippetType (int, FK on table SnippetTypes)
LanguageID  (int, FK on table Languages)
Text (string)
4

1 に答える 1

2

大丈夫、

失敗する理由は、追加しているカスタム CSS が原因だと思います。ValidationMessageFor は、検証が成功すると隠しクラスを配置します。

CSS でカスタム カラーなどを追加する場合は、スタイルをラッピング p タグに適用するか、ラッピング div/span を追加してそれに追加することを検討します。

のみを使用してビューでメッセージを定義することもできますが@Html.ValidationMessageFor(snippet => snippet.SnippetTypeID, "ErrorMessage");、より適切な方法は、モデルを取得してそのためのデータ注釈を作成することです。

方法の詳細については、この記事http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validation-with-the-data-annotation-validators-csをご覧ください。データ注釈によるモデルの検証。

また、ビューに基づいてカスタム検証を実行できるように、linq to sql クラスの代わりにカスタム クラスを渡すことを検討します。これらのカスタム クラスは、多くの場合、ViewModel と呼ばれます。

于 2012-06-06T15:07:17.637 に答える