Пользовательский атрибут ValidationAttribute в PartialView не отображает сообщения об ошибках
Я разработал концепцию пользовательской проверки с использованием ValidationAttribute на простом сайте mVC, проверяя диапазон дат. Интересует только то, что finishDate был до startDate. И все работало нормально. Ну, у меня нет проверки клиента, но на стороне сервера работает гладко. Все идет нормально.
Моя проблема сейчас в том, что в моем реальном решении у меня есть форма как частичное представление. Scneario представляет собой форму резюме, где вы можете создать несколько рабочих мест. Я включаю _CreatejobExperience частичное представление в родительский iew и показываю его с помощью плагина bquopup jquery.
Я реализовал все таким же образом, как я сделал с моим небольшим доказательством концепции, которая работала. но если при проверке произошел сбой, но всплывающее окно не закрылось, сообщение об ошибке не отображается.
Мой класс проверки
public class DateRangeAttribute : ValidationAttribute
{
public string[] PropertyNames { get; set; }
public DateRangeAttribute(params string[] propertyNames)
{
this.PropertyNames = propertyNames;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<DateTime>();
var startDate = values.FirstOrDefault();
var finishDate = (DateTime)value;
if (finishDate <= startDate)
{
return new ValidationResult("La fecha final debe ser posterior ala fecha de inicio");
}
return null;
}
}
Свойства и декоратор настроены так
[Display(Name = "Entry date")]
[DataType(DataType.Date)]
[Required]
public DateTime EntryDate { get; set; }
[Display(Name = "Finish date")]
[DataType(DataType.Date)]
[Required]
[DateRange("EntryDate", ErrorMessage="Error message")]
public DateTime RetirementDate { get; set; }
И в моем контроллере у меня есть действие, которое работает на форме сообщения, как это
[HttpPost]
public PartialViewResult AddJobExperience(JobExperienceViewModel jobExperience)
{
if (ModelState.IsValid)
{
var resume = (ResumeViewModel)Session["tempResume"];
resume.JobExperienceViewModels.Add(jobExperience);
Session["tempResume"] = resume;
return PartialView("_ListJobExperience", resume.JobExperienceViewModels);
}
else
{
return PartialView("_CreateJobExperience");
}
}
В моем доказательстве концепции, в моем контроллере у меня есть что-то вроде,
[HttpPost]
public PartialViewResult Index(ValidationModel model)
{
if(ModelState.IsVaid)
{
return RedirectToAction("Index", "Home");
}
else
{
return View();
}
}
Я думаю, что проблема в возвращении. Как я могу сделать сообщение об ошибке, которое будет показано в частичном представлении.
ОБНОВИТЬ
Родительское представление является индексным представлением контроллера и выглядит примерно так. Я только что удалил не соответствующие части
@using CAEWebSite.Models
@model CAEWebSite.Models.ResumeViewModel
@{
ViewBag.Title = "Hoja de Vida";
}
<div class="row">
@using (Ajax.BeginForm("Index", null, null, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>
@{var fullName = Model.FirstName +
(!String.IsNullOrWhiteSpace(Model.MiddleName) ? " " + Model.MiddleName : String.Empty) +
(!String.IsNullOrWhiteSpace(Model.LastName) ? " " + Model.LastName : String.Empty) +
(!String.IsNullOrWhiteSpace(Model.SecondLastName) ? " " + Model.SecondLastName : String.Empty);
}
@fullName
</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
<div class="col-md-12">
@Model.Email
</div>
</div>
<div class="form-group">
<div class="col-md-12">
@Model.UserName
</div>
</div>
<hr />
<h4>Job experiences</h4>
<div class="col-md-12">
<div id="divListJobExperience">
@Html.Partial("_ListJobExperience", Model.JobExperienceViewModels)
</div>
<p>
<a href="#" onclick="$('#newJobExperience').bPopup(); return false;">Nueva experiencia</a>
</p>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
}
<div id="newJobExperience" style="background-color:#fff; border-radius:5px;width:60%;">
<div class="col-md-12">
@Html.Partial("_CreateJobExperience", new JobExperienceViewModel())
</div>
</div>
<div>
@Html.ActionLink("Volver a la Lista", "Index", "SearchClient")
</div>
</div>