启用MVC客户端验证

时间:2016-12-17 19:55:02

标签: asp.net-mvc validation razor

我有

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

在我的配置中

    Html.EnableClientValidation(true);
    Html.EnableUnobtrusiveJavaScript(true);

在我看来和

    <script src="~/js/jquery.validate.min.js"></script>
<script src="~/js/jquery.validate.unobtrusive.min.js"></script>

在HTML源代码中(和jQuery一样)(浏览器中没有JS错误)

我有一个带有[Required]的表单元素,表单元素似乎与关联的data-属性呈现正常

<div class='form-group'>
                <label class="col-md-2 control-label" for="Username">en-gb(Username)</label>
                <div class='col-md-10'>
                    <div class='input-group'>
                        <div class='input-group-addon'><span class='fa fa-user'></span></div>
                        <input class="input-validation-error form-control" id="Username" name="Username" type="text" value="" />
                    </div>
                    <span class="field-validation-error help-block" data-valmsg-for="Username" data-valmsg-replace="true">en-gb(The en-gb(Username) field is required.)</span>
                    </div>
                </div>

但是没有发生客户端验证;表单始终提交给服务器。

我错过了什么?我应该检查什么?

修改 TextBoxFor位于System.Web.Mvc.Html.InputHelpers,并调用TextBoxHelper,后者又在同一文件中调用InputHelper。这叫 htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)看起来像这样:

public IDictionary<string, object> GetUnobtrusiveValidationAttributes(string name, ModelMetadata metadata)
    {
        Dictionary<string, object> results = new Dictionary<string, object>();

        // The ordering of these 3 checks (and the early exits) is for performance reasons.
        if (!ViewContext.UnobtrusiveJavaScriptEnabled)
        {
            return results;
        }

        FormContext formContext = ViewContext.GetFormContextForClientValidation();
        if (formContext == null)
        {
            return results;
        }

        string fullName = ViewData.TemplateInfo.GetFullHtmlFieldName(name);
        if (formContext.RenderedField(fullName))
        {
            return results;
        }

        formContext.RenderedField(fullName, true);

        IEnumerable<ModelClientValidationRule> clientRules = ClientValidationRuleFactory(name, metadata);
        UnobtrusiveValidationAttributesGenerator.GetValidationAttributes(clientRules, results);

        return results;
    }

(资料来源:http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5cb74eb3b2f3#src/System.Web.Mvc/HtmlHelper.cs

我遇到的问题是formContext.RenderedField(fullName)返回true,因此我的input元素中没有添加验证属性。

2 个答案:

答案 0 :(得分:0)

在您的视图中,您是否呈现以下代码?

def WebScrape():  
    linktoenter = input('Where do you want to scrape from today?: ')
    url = linktoenter
    html = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(html, "lxml")

    if linktoenter in url:
        print('Retrieving your links...')
        links = {}
        n = 0
        link_title=soup.findAll('a',{'class':'title'})
        n += 1
        links[n] = link_title
        for eachtitle in link_title:
            print(eachtitle['href']+","+eachtitle.string)
    else:
        print('Please enter another Website...')

假设您正在使用默认项目模板,您需要在视图中包含您要渲染的内容以启用客户端验证...或者,添加@section Scripts { @Scripts.Render("~/bundles/jqueryval") } 在布局文件的底部,以便在所有视图中启用它。

还要确保在Bundles配置文件中定义Scripts.Render("~/bundles/jqueryval")

答案 1 :(得分:0)

formContext.RenderedField(fullName)是一个红色的鲱鱼,我真的不知道那是什么。

问题是我已经将ValidationAttribute类子类化,以便从数据库而不是resx中提供全局化查找。这意味着它们不会出现在ModelMetadata

一种解决方案是在重写的属性上实现接口System.Web.Mvc.IClientValidatable。但是,基类没有实现这个接口,因此它们必须通过其他一些机制来配置客户端验证 - 而这是另一种不够智能的机制来获取开箱即用的子类{ {1}}秒。