gpt4 book ai didi

jquery - ASP.NET MVC 4 - 客户端验证不起作用

转载 作者:行者123 更新时间:2023-12-03 22:20:51 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 2012,但无法使自定义属性客户端逻辑正常工作为了以较小的规模重现,我创建了一个新的 MVC 4 项目,我创建了以下永远不会验证的模型和属性

public class MyModel
{
public int Id { get; set; }
[Required]
public string LastName { get; set; }
[NeverValid(ErrorMessage="Serverside Will Never Validate")]
public string FirstName { get; set; }
}

public class NeverValidAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
return false;
}

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return new ValidationResult(this.ErrorMessage, new[] { validationContext.MemberName });
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "nevervalid"
};
}
}

然后我将以下操作添加到 HomeController

public ActionResult Index()
{
return View(new MyModel());
}

[HttpPost]
public ActionResult Index(MyModel model)
{
if (!ModelState.IsValid)
{
// Will Always Be Invalid
}

return View(model);
}

还有一个名为 nevervalid.js 的 javascript 文件

$(function () {
$.validator.addMethod("nevervalid", function () {
return false;
}, "Clientside Should Not Postback");

$.validator.unobtrusive.adapters.addBool("nevervalid");
});

和索引 View

@model CustomAttribute.Models.MyModel

@{
ViewBag.Title = "Home Page";
}

@using (Html.BeginForm())
{
@Html.ValidationSummary(true)

<fieldset>
<legend>MyModel</legend>

@Html.HiddenFor(model => model.Id)

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

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

<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/Scripts/nevervalid.js")
}

我的 web.config 中的相关区域如下所示

<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

当页面加载时,会加载以下文件(从 Chrome 的 F12 下的网络选项卡中获取)

http://localhost:7440/
http://localhost:7440/Content/site.css
http://localhost:7440/Scripts/modernizr-2.5.3.js
http://localhost:7440/Scripts/jquery-1.7.1.js
http://localhost:7440/Scripts/jquery.unobtrusive-ajax.js
http://localhost:7440/Scripts/jquery.validate.js
http://localhost:7440/Scripts/jquery.validate.unobtrusive.js
http://localhost:7440/Scripts/nevervalid.js

我的自定义属性将相关的外观数据添加到名字输入中,如下所示...

    <input class="text-box single-line valid" data-val="true" data-val-nevervalid="Serverside Will Never Validate" id="FirstName" name="FirstName" type="text" value="">

所以,我问你,为什么哦,为什么这个东西必须回发才能进行服务器端验证,而我这里有一些看起来完美的 JavaScript 代码?我是否必须在无月之夜在某个山顶上牺牲一些动物?

最佳答案

我想知道如果您更改 nevervalid.js 以便代码在文档准备好之前执行,会发生什么。

我的基本想法是,不引人注目的验证是通过在 dom 准备好时解析文档来工作的......但是如果您同时/之后加载自定义验证内容,那么它不会知道在什么时候该做什么它会出现在您的自定义验证数据属性中。

无论如何,尝试将 nevervalid.js 更改为:

(function($) {
$.validator.addMethod("nevervalid", function () {
return false;
}, "Clientside Should Not Postback");

$.validator.unobtrusive.adapters.addBool("nevervalid");
})(jQuery);

关于jquery - ASP.NET MVC 4 - 客户端验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15529540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com