问题
实际上有两个相关的问题:
- 我应该为每个页面创建一个 ViewModel 吗?
Create.cshtml
如果您在为两个页面(和 )创建单个 ViewModel 类时没有问题,Edit.cshtml
我如何以不同的方式验证 ViewModel(取决于正在使用的页面)
资源
视图模型
public class ProjectViewModel
{
public string Name { get; set; }
public string Url { get; set; }
public string Description { get; set; }
}
编辑.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()
项目验证器.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。
谢谢大家的帮助!