DropDownListFor Unobtrusive验证显示在空表单上

时间:2012-06-06 14:00:19

标签: c# asp.net-mvc unobtrusive-validation

当我打开此页面时(即使是第一次),我总是得到验证消息,即使我在其中一个下拉列表中选择了值,消息也不会消失。如果我在两者中都选择了值,我可以提交表单但消息仍然不会消失。

Snippet是Linq to sql class而LanguageIDSnippetTypeID是整数,我认为这是因为我将空模型传递给View LanguageID和{{1}是null并且AFAIK Linq到Sql类在非可空的整数上是必需的。

如何解决此问题,以便在用户尝试提交表单之前不会显示验证消息,并且如果选择其中一个下拉列表来删除验证消息。

查看

SnippetTypeID

控制器

@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" />
}

模型

模型是Linq到Sql类。

        //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();
        }

1 个答案:

答案 0 :(得分:2)

好的,

所以我认为它失败的原因是因为你要添加的自定义CSS。验证成功时,ValidationMessageFor将放置一个隐藏的类。

如果您想要添加自定义颜色或类似的东西,我会考虑将样式应用于包装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传递给sql类,以便您可以根据视图进行自定义验证。这些自定义类通常被称为ViewModels。