Вопросы
На самом деле есть два связанных вопроса:
- Должен ли я создать ViewModel для каждой страницы?
- Если у вас нет проблем при создании одного класса ViewModel для двух страниц (
Create.cshtml
и Edit.cshtml
), как я могу проверить ViewModel по-разному (в зависимости от используемой страницы)
Источник
ViewModel
public class ProjectViewModel
{
public string Name { get; set; }
public string Url { get; set; }
public string Description { get; set; }
}
Edit.cshtml
@using BindSolution.ViewModel.Project
@model ProjectViewModel
@{
ViewBag.Title = Model.Name;
}
@Html.EditorForModel()
Create.cshtml
@using BindSolution.ViewModel.Project
@model ProjectViewModel
@{
ViewBag.Title = "New Project";
}
@Html.EditorForModel()
ProjectValidator.cs
public class ProjectValidator : AbstractValidator<ProjectViewModel>
{
private readonly IProjectService _projectService;
public ProjectValidator(IProjectService projectService)
{
_projectService = projectService;
RuleFor(p => p.Name)
.NotEmpty().WithMessage("required field")
/*The validation should be made only if the page is Create.cshtml. That is, if you are creating a new project.*/
.When(p => p.??) //Problem Here!!
.Must(n => !_projectService.Exist(n)).WithMessage("name already exists");
RuleFor(p => p.Url)
.NotEmpty().WithMessage("required field");
}
}
Обратите внимание, что если пользователь редактирует существующий проект, проверка свойства name
не должна выполняться снова.
ProjectController.cs> Метод редактирования
[HttpPost]
public ActionResult Edit(Guid projectID, ProjectViewModel model)
{
var project = _projectService.Repository.Get(projectID);
if (ModelState.IsValid && TryUpdateModel(project))
{
_projectService.Repository.Attach(project);
if (_projectImageWrap.Create(project) && _projectService.Repository.Save() > 0)
return AjaxRedirect("Index");
}
return View(model);
}
Примечания
Если я создаю ViewModel для каждой страницы, происходит дублирование кода, поскольку страницы имеют одинаковые свойства.
Добавление свойства в ViewModel, указывающее, какая страница отображается, не решает мою проблему, так как для создания экземпляра ViewModel я использую AutoMapper.
Для проверки данных я использую FluentValidator .
Спасибо всем за помощь!