每个页面的“ViewModel”(“Create.cshtml”和“Edit.cshtml”)



问题

实际上有两个相关的问题:

  1. 我应该为每个页面创建一个ViewModel吗
  2. 如果在为两个页面(Create.cshtmlEdit.cshtml(创建单个ViewModel类时没有问题,我如何以不同的方式验证ViewModel(取决于正在使用的页面(

来源

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()

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。

感谢大家的帮助

我的理解是ViewModels和Views之间没有1:1的相关性。通常情况下,你会有一个不需要ViewModel的视图。

如果并且仅当您需要一个完全平行并根据特定视图定制的模型时,您才会想要创建ViewModel。这不会是100%的情况。

当页面之间的功能/用例/验证不同时,我使用不同的模型。如果除了ID或类似的东西之外,它完全相同,我使用相同的模型,如果差异很小,也可以使用相同的视图。

由于您的验证是不同的,如果我这样做,我会创建两个不同的模型,这样我就可以使用开箱即用的DataAnnotations,尽管可能不需要您的验证。您也可以在编辑模型上为name设置只读属性,因为它不再可编辑。

对我来说,每次都必须对同一个对象进行相同的验证,主要是为了确保对象的一致性,无论是创建还是编辑对象。

我认为您应该只创建一个验证,并编辑您的"exists"方法以通过验证它是新对象还是存储库中的当前对象。

就我个人而言,我对2个视图模型没有问题,尤其是如果(正如Paul Tyng所建议的(您为编辑和创建场景所常用的字段使用基类。

然而,如果你真的只想要一个单一的视图模型,那么你要么需要:

  • 在视图模型中添加一个标志,并在验证器中使用When((方法。但请注意,这不会生成适当的仅客户端验证
  • 定义第二个验证器,并从控制器中调用适当的验证器(即,代替"自动"验证(

提供另一个视图Edit.cshtml,允许用户编辑所选项目的数据。

  1. 创建另一个基于ItemName的视图Query.cshtml,该视图将允许用户查询Inventory表。

  2. 计算总利润(销售次数(销售价格采购成本((。显示总利润。

(奖金(创建另一个视图Sell.cshtml,它将指示物品的销售。为所选记录向NumberSold加一,并从NumberInventory中减去一。

相关内容

  • 没有找到相关文章

最新更新