質問
実際には、関連する 2 つの質問があります。
- ページごとに ViewModel を作成する必要がありますか?
Create.cshtml
2 つのページ (および )に対して単一の ViewModel クラスを作成することに問題がない場合Edit.cshtml
、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()
作成.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 > Edit メソッド
[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を使用します。
ご協力ありがとうございました!