유효성을 확인하기 위해 샘플 MVC3 응용 프로그램을 만들었습니다. 그것은 DataAnnotations를 사용하고 있습니다. CustomContactAttribute CustomStartLetterMatch라는 사용자 지정을 만들었습니다. 그것은 "System.Web.Mvc.IClientValidatable"을 구현하고 있습니다. 눈에 거슬리는 jQuery로 작성된 해당 클라이언트 측 코드가 있습니다. 이것은 예상대로 작동합니다.ASP.NET MVC3 : ValidationType ModelClientValidationRule
사용자 정의 유효성 검사기 정보 : 이름 입력과 성 입력을 비교합니다. 두 문자의 첫 문자가 같지 않으면 오류가 발생합니다.
내가 말했듯이, 응용 프로그램이 잘 작동합니다. 그러나 내가 rule.ValidationType = "greaterdate";
을 볼 때 나는 혼란스러워했다. 나는 이것을 "anotherDefaultType"과 같은 다른 것으로 변경하고 싶었다. 내가 그것을 바꿀 때, 그것은 jQuery 오류로 실패한다.
- 왜 그럴까요?
- 사용 가능한 ValidationTypes는 무엇입니까?
using System; using System.ComponentModel.DataAnnotations; using System.Collections.Generic; namespace MyValidationTEST { public class Person { [Required(ErrorMessage = "First name required")] public string FirstName { get; set; } [CustomStartLetterMatch("FirstName")] [StringLength(5,ErrorMessage = "Must be under 5 characters")] public string LastName { get; set; } [Range(18,50,ErrorMessage="Must be between 18 and 50")] public int Age { get; set; } } public sealed class CustomStartLetterMatch : ValidationAttribute, System.Web.Mvc.IClientValidatable { private const string _defaultErrorMessage = " First letter of '{0}' must be same as first letetr of '{1}'"; private string _basePropertyName; public CustomStartLetterMatch(string basePropertyName) : base(_defaultErrorMessage) { _basePropertyName = basePropertyName; } //Override FormatErrorMessage Method public override string FormatErrorMessage(string name) { return string.Format(_defaultErrorMessage, name, _basePropertyName); } //Override IsValid protected override ValidationResult IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext) { //Get PropertyInfo Object var basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName); var baseValue = (string)basePropertyInfo.GetValue(validationContext.ObjectInstance, null); var currentValue = (string)value; string firstLetterBaseValue = baseValue.Substring(0, 1); string firstLetterCurrentValue = currentValue.Substring(0, 1); //Comparision if (!string.Equals(firstLetterBaseValue, firstLetterCurrentValue)) { var message = FormatErrorMessage(validationContext.DisplayName); return new ValidationResult(message); } //Default return - This means there were no validation error return null; } public IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(System.Web.Mvc.ModelMetadata metadata, System.Web.Mvc.ControllerContext context) { var rule = new System.Web.Mvc.ModelClientValidationRule(); rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); rule.ValidationParameters.Add("other", _basePropertyName); rule.ValidationType = "greaterdate"; yield return rule; } }
}
VIEW
@model MyValidationTEST.Person @{ ViewBag.Title = "Create"; } <h2>Create</h2> <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"> </script> @*UnObtrusive*@ <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> <script type="text/javascript"> /*Register adapter - addSingleVal*/ jQuery.validator.unobtrusive.adapters.addSingleVal("greaterdate", "other"); /*Validation type names in unobtrusive client validation rules must consist of only lowercase letters*/ /*Add Method*/ jQuery.validator.addMethod("greaterdate", function (val, element, other) { var modelPrefix = element.name.substr(0, element.name.lastIndexOf(".") + 1) var otherVal = $("[name=" + modelPrefix + other + "]").val(); if (val && otherVal) { var lastNameFirstLetter = val.substr(0, 1); var firstNameFirstLetter = otherVal.substr(0, 1); if (lastNameFirstLetter != firstNameFirstLetter) { return false; } } return true; }); </script> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Person</legend> <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> <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.Age) </div> <div class="editor-field"> @Html.EditorFor(model => model.Age) @Html.ValidationMessageFor(model => model.Age) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div>
CONTROLLER :
,536 - 이 scenari
코드의 ValidationType을 변경하는 제안 된 방법 무엇입니까
using System.Web.Mvc;
namespace MyValidationTEST.Controllers
{
public class RelativesController : Controller
{
// GET: /Relatives/
public ActionResult Index()
{
return View();
}
// GET: /Relatives/Create
public ActionResult Create()
{
Person person = new Person();
return View(person);
}
// POST: /Relatives/Create
[HttpPost]
public ActionResult Create(Person relativeToAdd)
{
if (ModelState.IsValid)
{
return RedirectToAction("Index");
}
return View(relativeToAdd);
}
}
}
는 READING :
ASP.NET MVC3 - Custom validation attribute -> Client-side broken
'rule.ValidationType = "greaterdate";를 변경 했습니까? 아니면 일치하도록 자바 스크립트 코드를 변경 했습니까? –
3 곳에서 변경했습니다. 1) rule.ValidationType = "greaterdate"2) Javascript로 어댑터 등록. 3) 자바 스크립트에서 addmethod – Lijo
너무 컨트롤러 코드를 추가 했으므로 오류를보기 위해 직접 시도 할 수 있습니다. – Lijo