질문
각 페이지 (`Create.cshtml`과`Edit.cshtml`)에 대한`ViewModel '?
이 개 관련 질문이 실제로 있습니다- 나는 각 페이지에 대한 뷰 모델을 만들어야가?
- 당신은 내가
소스 (사용중인 페이지)에 따라 다른 방식으로 뷰 모델을 검증 할 수있는 방법 두 페이지 (Create.cshtml
및 Edit.cshtml
)에 대한 단일 뷰 모델 클래스를 만드는 문제가없는 경우
뷰 모델
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 사용자가 기존 프로젝트, 속성의 검증을 편집 할 경우 name
되어서는 안된다는
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");
}
}
주 다시 했어. 페이지가 동일한 속성을 가지고 있기 때문에
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을 사용합니다.
도움 주셔서 감사합니다.
나는 완전히 동의합니다! 두 번째 질문은 어떻습니까? 사용자가 내 ProjectValidator 클래스에서 프로젝트를 편집하는 경우 규칙을 무시하는 방법 – ridermansb