首先回答你的第三个问题:不,没有比你正在做的事情更简单的方法了。只需两行代码即可使其正常工作,这再简单不过了。尽管有一个您可以使用的插件,就像问题中所解释的那样不引人注目的验证不适用于动态内容 https://stackoverflow.com/a/14982495/434949
你的第一个问题,如何集中验证,我通常使用一个单独的类文件来存储我所有的验证规则。这样我就不必浏览每个类文件来查找规则,而是将它们全部放在一个位置。如果这样更好,那就是选择的问题了。我开始使用它的主要原因是能够向自动生成的类(例如实体框架中的类)添加验证。
所以我有一个名为ModelValidation.cs
在我的数据层中,并且有我所有模型的代码,例如
/// <summary>
/// Validation rules for the <see cref="Test"/> object
/// </summary>
/// <remarks>
/// 2015-01-26: Created
/// </remarks>
[MetadataType(typeof(TestValidation))]
public partial class Test { }
public class TestValidation
{
/// <summary>Name is required</summary>
[Required]
[StringLength(100)]
public string Name { get; set; }
/// <summary>Text is multiline</summary>
[DataType(DataType.MultilineText)]
[AllowHtml]
public string Text { get; set; }
}
现在,正如您所注意到的,我没有提供实际的错误消息。我用Haacked 的约定 http://haacked.com/archive/2011/07/14/model-metadata-and-validation-localization-using-conventions.aspx/添加消息。它使得添加本地化验证规则变得简单。
它基本上归结为包含以下内容的资源文件:
Test_Name = "Provide name"
Test_Name_Required = "Name is required"
当您拨打常规电话时,将使用这些消息和命名MVC view
代码就像
<div class="editor-container">
<div class="editor-label">
@Html.LabelFor(model => model.Name) <!--"Provide name"-->
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name) <!--"Name is required"-->
</div>
</div>
您的第二个问题,关于添加/编辑的不同验证可以通过两种方式处理。最好的方法是按照实际意图使用视图。这意味着您不会将实际模型传递给视图,而是创建一个仅包含数据的视图模型。所以你有一个视图模型Create
具有适当的验证规则和视图模型Edit
使用适当的规则,当它们通过时,您将结果插入到实际模型中。
然而,这需要更多的代码和手动工作,所以我可以想象你并不是真的愿意这样做。
另一种选择是使用条件验证 https://stackoverflow.com/a/5285348/434949就像 viperguynaz 所解释的那样。现在,我的类需要在编辑/添加之间进行更改,而不是布尔值,而是有一个primary key
Id
int
。所以我检查是否Id>0
以确定它是否是编辑。
UPDATE:
如果你想更新每个 ajax 调用的验证,你可以使用jQuery ajaxComplete
。这将在每次 ajax 请求后重新验证所有表单。
$( document ).ajaxComplete(function() {
$('form').each(function() {
var $el = $(this);
$el.data('validator', null);
$.validator.unobtrusive.parse($el);
})
});
如果这是您想要的,取决于您通过以下方式收到表格的频率AJAX
。如果你有很多AJAX
请求,例如每 10 秒轮询一次状态,那么您就不需要这样。如果你偶尔有AJAX
request,主要包含一个表单,那么你就可以使用它。
If your AJAX
返回您想要验证的表单,那么是的,更新验证是一个很好的做法。但我想更好的问题是“我真的需要通过 AJAX 发送表单吗?”AJAX
有趣且有用,但应谨慎使用。