저는 StartDate 및 EndDate가있는 ViewModel이 있습니다. 분명히 StartDate 유효성을 검사해야합니다 < = EndDate. MVC3 서버 유효성 검사가 실행되지 않습니다.
은 내가StartDateBeforeEndDate
검증 속성을 생성하고 그와 뷰 모델 클래스 장식 :
public class ValidProgramDisplayStartDateAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
ProgramCreateOrEditViewModel vm = value as ProgramCreateOrEditViewModel;
if (vm == null) return true; //not our problem
if (!vm.EndDisplay.HasValue) return true;
//if you don't set an end date, you can't be invalid
return vm.StartDisplay <= vm.EndDisplay;
}
}
을 ...
[ValidProgramDisplayStartDate(ErrorMessage="The program start display date cannot be after the program display end date.")]
public class ProgramCreateOrEditViewModel
{
[Required(ErrorMessage = "A program title is required.")]
[StringLength(255, ErrorMessage = "The program title cannot exceed 255 characters.")]
public virtual string Title { get; set; }
private DateTime _startDisplayDate = DateTime.Now;
[Display(Name = "Display Start Date")]
[Required(ErrorMessage = "A start display date is required")]
[DataType(DataType.Date)]
public virtual DateTime StartDisplay { get { return _startDisplayDate; } set { _startDisplayDate = value; } }
[Display(Name="Display End Date")]
[DataType(DataType.Date)]
public virtual DateTime? EndDisplay { get; set; }
...more properties omitted...
}
제목이 제대로 검증하고 검증 메시지는 검증 요약으로 나타납니다 예상했지만 IsValid의 중단 점은 실행되지 않으며 유효하지 않은 쌍을 지정하면 유효성 검사 오류가 표시되지 않습니다.
ValidationAttribute
은 ViewModel 개체를 만들고 날짜를 채우고 ValidationAttribute
개체를 만들고 IsValid
메서드를 호출하는 단위 테스트에서 올바르게 작동합니다. 또한 컨트롤러의 POST 동작에 중단 점을 설정하고 Visual Studio의 직접 실행 창을 사용하여 ValidationAttribute
을 생성하고받은 ViewModel을 전달하면 올바르게 작동합니다.
이 단계에서는 클라이언트 측 유효성 검사에 대해별로 신경 쓰지 않습니다. 그것은 "좋은 시간"을 가지고 있지만 누가 시간을 얻었습니까? 그러나 서버 측 유효성 검사는 필수적입니다.
보기 :
@model MyProject.Web.Mvc.Controllers.ViewModels.ProgramCreateOrEditViewModel
@using MvcContrib.FluentHtml
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@using (Html.BeginForm())
{
<fieldset class="program"><legend>Program</legend>
@if (!ViewData.ModelState.IsValid)
{
<p class="error">Please correct all errors listed below. The program cannot be saved while errors remain.</p>
@Html.ValidationSummary(false)
}
@Html.HiddenFor(m => m.Id)
<h3>
@Html.LabelFor(m => m.Title)
@Html.TextBoxFor(m => m.Title)</h3>
<div id="accordion">
<h3><a href="#">Dates:</a></h3>
<div class="section">
Dates related to <em>displaying</em> the program on our site:<br />
@Html.LabelFor(m => m.StartDisplay)
@Html.EditorFor(m => m.StartDisplay, new { _class = "date" })
@Html.LabelFor(m => m.EndDisplay)
@Html.EditorFor(m => m.EndDisplay, new { _class = "date enddisplay" })
</div>
... more form fields omitted ...
</div>
<p>
<input type="submit" value="Save" /></p>
</fieldset>
}
그리고 마지막으로, 편집기 템플릿 :
@model DateTime?
@Html.TextBox("", Model.HasValue ? Model.Value.ToString("MM/dd/yyyy") : String.Empty, new { @class = "date" })
UnobtrusiveJavaScript가 필요하다면 사용하도록 설정 했습니까? – stack72
나는 그 길을 내려다 보지 않았다. b/c 나는 서버쪽에 대해 완전히 염려하고있다. 자바 스크립트가 서버 쪽 유효성 검사에 영향을 준다면 나는 오늘 더 많은 카페인을 필요로 할 것이다. . :) –