ASP.NET MVC 2에서 작동하도록 유효성을 검사하려고하지만 많은 성공을 얻지 못했습니다.ViewModel Validation 내에서 캡슐화 된 ASP.NET MVC 2 모델
많은 수의 필드가 포함 된 복잡한 클래스가 있습니다. (묻지 말아라 - 이것은 실세계의 베스트 프랙티스가 만질 수없는 것들 중 하나이다.) 이것은 보통 나의 모델 일 것이고 LINQ-to-SQL 생성 클래스이다.
생성 된 코드이므로 http://davidhayden.com/blog/dave/archive/2009/08/10/AspNetMvc20BuddyClassesMetadataType.aspx에 따라 MetaData 클래스를 만들었습니다.
public class ConsultantRegistrationMetadata
{
[DisplayName("Title")]
[Required(ErrorMessage = "Title is required")]
[StringLength(10, ErrorMessage = "Title cannot contain more than 10 characters")]
string Title { get; set; }
[Required(ErrorMessage = "Forename(s) is required")]
[StringLength(128, ErrorMessage = "Forename(s) cannot contain more than 128 characters")]
[DisplayName("Forename(s)")]
string Forenames { get; set; }
// ...
내 생성 된 클래스의 부분 클래스에이 첨부했습니다 :
내 양식이 복잡하기 때문에, 그런 내가 가지고있는 등 SelectLists, 같은 종속성을 가지고 있습니다[MetadataType(typeof(ConsultantRegistrationMetadata))]
public partial class ConsultantRegistration
{
// ...
의 ViewModel 패턴에 캡슐화 - 그리고 속성으로 ConsultantRegistration 모델 포함 :
public class ConsultantRegistrationFormViewModel
{
public Data.ConsultantRegistration ConsultantRegistration { get; private set; }
public SelectList Titles { get; private set; }
public SelectList Countries { get; private set; }
// ...
그래서 기본적으로 뷰 모델 => 모델
입니다내보기는 다음과 같습니다
<p>
<%: Html.LabelFor(model => model.ConsultantRegistration.Title) %>
<%: Html.DropDownListFor(model => model.ConsultantRegistration.Title, Model.Titles,"(select a Title)") %>
<%: Html.ValidationMessage("Title","*") %>
</p>
<p>
<%: Html.LabelFor(model => model.ConsultantRegistration.Forenames) %>
<%: Html.TextBoxFor(model => model.ConsultantRegistration.Forenames) %>
<%: Html.ValidationMessageFor(model=>model.ConsultantRegistration.Forenames) %>
</p>
문제는, 검증은 효과가없는있는 메타 데이터 클래스 속성. 인터페이스를 통해 시도했지만 효과가 없습니다. 그 이유는 ViewModel 내 모델을 캡슐화하기 때문이라고 생각하기 시작했습니다. 다음과 같이
내 컨트롤러 (활동 작성)입니다 : 주석에 설명 된대로
[HttpPost]
public ActionResult Create(Data.ConsultantRegistration consultantRegistration)
{
if (ModelState.IsValid) // this is always true - which is wrong!!
{
try
{
consultantRegistration = ConsultantRegistrationRepository.SaveConsultantRegistration(consultantRegistration);
return RedirectToAction("Edit", new { id = consultantRegistration.ID, sectionIndex = 2 });
}
catch (Exception ex)
{
ModelState.AddModelError("CreateException",ex);
}
}
return View(new ConsultantRegistrationFormViewModel(consultantRegistration));
}
에서, ModelState.IsValid 속성은 항상 Validaiton 주석이 유효없는과 필드에도 불구하고, true를 돌려줍니다. (Forenames는 중요한보기이다).
내가 MVC 초보자 인 것을 고려해 볼 때 분명하지 않은 점이 있습니까? 나는 Jon Galloway가 http://www.asp.net/learn/mvc-videos/video-10082.aspx에 demoed 메커니즘을 쫓았습니다.
(나는 그것이 무엇인지 전혀 모른다하고 MVC 하나입니다 생각한다. 암 인식 t은 ASP.NET MVC Model/ViewModel Validation 비슷하지만 해당 게시물이 경우 xval에 대해 이야기하는 것 같습니다) 나는이 작품을 만들기 위해 노력했습니다
아, 훌륭합니다. LINQ-to-SQL으로 생성 된 코드에 직접 특성을 적용하면 작동합니다 (JS는 아니지만 절반은 유효합니다). 분명히 해결책이 아닙니다. –
업데이트 답변 ... –
감사합니다. Dave. 나는 수요일까지 일을 끝내고 나서 좀 기다려야 할 것이다. 그러나 주목 받았다. –