MVC4 验证在提交后进行

MVC4 Validation happens after submit

提问人:florinszilagyi 提问时间:12/11/2013 最后编辑:Aritra Bflorinszilagyi 更新时间:12/17/2013 访问量:448

问:

我的 MVC4 应用程序存在一些问题 - 表单验证仅在提交后进行。

我希望在提交之前对表单进行验证。 这是我的观点(部分)

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    Html.EnableClientValidation();
    Html.EnableUnobtrusiveJavaScript();
    <fieldset>
    <legend>Offer</legend>
    <div class="editor-label">
        @Html.LabelFor(model => model.HotelName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.HotelName)
        @Html.ValidationMessageFor(model => model.HotelName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.LocationName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.LocationName)
        @Html.ValidationMessageFor(model => model.LocationName)
     </div>

我在我的web.config中也有

    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

这些是我的页面中包含的所有脚本

    <script type="text/javascript" length="7" src="/Scripts/jquery/jquery-2.0.3.js?cdv=1">
    <script type="text/javascript" length="7" src="/Scripts/jquery/jquery-2.0.3.min.js?cdv=1">
    <script type="text/javascript" length="7" src="/Scripts/jquery/jquery.cookies.js?cdv=1">
    <script type="text/javascript" length="7" src="/Scripts/language.js?cdv=1">
    <script type="text/javascript" src="/Scripts/jqueryval/jquery.validate.js?cdv=1">
    <script type="text/javascript" src="/Scripts/jqueryval/jquery.validate.min.js?cdv=1">
    <script type="text/javascript" src="/Scripts/jqueryval/jquery.validate.unobtrusive.js?cdv=1">
    <script type="text/javascript" src="/Scripts/jqueryval/jquery.validate.unobtrusive.min.js?cdv=1">
    <script type="text/javascript" src="/Scripts/jquery-ui/jquery-ui-1.10.3.js?cdv=1">
    <script type="text/javascript" src="/Scripts/jquery-ui/jquery-ui-1.10.3.min.js?cdv=1">
    <script type="text/javascript" src="/Scripts/file-upload/jquery.fileupload.js?cdv=1">
    <script type="text/javascript" src="/Scripts/file-upload/jquery.fileupload-process.js?cdv=1">
    <script type="text/javascript" src="/Scripts/file-upload/jquery.fileupload-main.js?cdv=1">
    <script type="text/javascript" src="/Scripts/file-upload/jquery.fileupload-validate.js?cdv=1">
    <script type="text/javascript" src="/Scripts/file-upload/jquery.iframe-transport.js?cdv=1">
    <script type="text/javascript" src="/Scripts/jquery.jcrop.min.js?cdv=1">
    <script type="text/javascript" src="/Scripts/imagemodel.js?cdv=1">

据我所知,验证是用jquery完成的,不显眼。 奇怪的是,如果我从控制台手动运行 $(“form”).valid(),它会返回 true,但是如果我在 $(“form”).valid() 上有“required”属性,则 $(“form”).valid() 会正确触发。

有没有办法将“必需”属性添加到必要输入中?或者,也许还有另一种方法可以进行客户端验证。

谢谢

jquery asp.net-mvc-4 jquery-validate unobtrusive-javascript

评论

0赞 KrishnaDhungana 12/11/2013
您使用的是视图模型吗?它们是否具有必需的属性?
0赞 Qpirate 12/11/2013
这完全取决于您对模型的验证。如果你正在使用,你将不得不向你的模型添加属性,FluentValidation 将需要一个不同的类DataAnnotaions
0赞 florinszilagyi 12/11/2013
是的,我认为该模型具有所需的属性。 我没有使用 MVC 的经验,所以如果有什么问题,我非常愿意承认并修复[Required] [DisplayName("Hotel")] public string HotelName { get; set; }
0赞 florinszilagyi 12/12/2013
我注意到我的模型属性没有为字符串添加 data-val 和 data-val-required 属性。所以这似乎是问题所在,如果我手动将它们添加到 DOM 页面,它可以工作,但我不知道如何让 mvc 添加它们

答:

0赞 florinszilagyi 12/17/2013 #1

我所采用的解决方案是为 HtmlHelper 类创建一个扩展,该类创建自定义验证控件,其中验证属性将添加到生成的 HTML 中。

  public static MvcHtmlString ValidatedTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> attributes)
    {
        var message = GetMessage(htmlHelper, expression);
        return htmlHelper.TextBoxFor(expression, new Dictionary<string, object>(attributes)
            {
                { "data-val", "true" },
                { "data-val-required", message ?? "Must not be empty"},
            });
    }

 private static string GetMessage<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        PropertyInfo[] props = metadata.ContainerType.GetProperties();

        string message = null;
        var info = props.First(prop => prop.Name == metadata.PropertyName);
        var attribute = info.GetCustomAttribute(typeof (RequiredAttribute)) as RequiredAttribute;
        if (attribute != null)
        {
            message = attribute.ErrorMessage;
            if (string.IsNullOrEmpty(message))
            {
                var resource = attribute.ErrorMessageResourceType;
                var resourceName = attribute.ErrorMessageResourceName;

                if (resource == null || resourceName == null)
                    return null;

                message = new ResourceManager(resource).GetString(resourceName);
            }
        }

        return message;
    }