我注意到,在創建自定義驗證屬性時,我的驗證僅在本機MVC數據註釋激發後觸發。有什麼辦法可以「同時」發射?使用註釋和自定義屬性時的驗證順序
爲了說明我的意思,假裝我有這樣的形式:
FirstName: <FirstName Textbox>
LastName: <LastName TextBox>
Zip: <Zip TextBox>
所以我有一個[必填]註釋爲所有3,但除此之外,對於郵編財產,我有一個自定義屬性。如果用戶不輸入名字或姓氏,但輸入了一個無效的Zip(我的屬性應該驗證這一點),那麼所有三個都應該有一個錯誤信息 - 但是沒有。 firstName和lastName只有一個錯誤。
這是代碼:
Person.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
// My validator
using MvcApplication3.Extensions.Validation;
namespace MvcApplication3.Models
{
public class Person
{
[Required(ErrorMessage="Field required!")]
public string firstName{get;set;}
[Required(ErrorMessage="Field required!")]
public string lastName { get; set; }
[Zip(ErrorMessage="You gotta put in a valid zip code")]
[Required(ErrorMessage="Field required!")]
public string zipCode { get; set; }
}
}
控制器:
[HttpPost]
public ActionResult Index(FormCollection form, Person person)
{
return View(person);
}
檢視:
@model MvcApplication3.Models.Person
@{
ViewBag.Title = "Person";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<h2>
Testing Form: @Model.firstName
</h2>
<hr />
@{Html.EnableClientValidation();}
@using (Html.BeginForm())
{
@Html.LabelFor(model => model.firstName)
@Html.TextBoxFor(model => model.firstName)
@Html.ValidationMessageFor(model=>model.firstName)
<br /><br />
@Html.LabelFor(model => model.lastName)
@Html.TextBoxFor(model => model.lastName)
@Html.ValidationMessageFor(model=>model.lastName)
<br /><br />
@Html.LabelFor(model => model.zipCode)
@Html.TextBoxFor(model => model.zipCode)
@Html.ValidationMessageFor(model=>model.zipCode)
<br /><br />
<input type="submit" value="Submit" />
}
郵編驗證器(Zip.cs):
public class ZipAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
bool foundMatch = false;
try
{
foundMatch = Regex.IsMatch(value.ToString(), "\\A\\b[0-9]{5}(?:-[0-9]{4})?\\b\\z");
}
catch (ArgumentException ex)
{
// Syntax error in the regular expression
}
return foundMatch;
}
}
此外,我知道我可以使用Regexp數據註釋來做到這一點,但我期待在未來推出自己的自定義驗證器。
謝謝!
感謝您的反饋意見。所以我幾乎必須編寫與我的驗證器相匹配的等效JavaScript代碼? – SaltProgrammer 2011-05-13 19:55:18
不幸的是,你做 - 看到我的答案下面的鏈接。你可以用Script#做這個,但是沒有什麼內置的將你的C#轉換成Javascript(但這就是Script#打算做的事情:-)) – 2011-05-14 09:08:16