4

質問

実際には、関連する 2 つの質問があります。

  1. ページごとに ViewModel を作成する必要がありますか?
  2. Create.cshtml2 つのページ (および )に対して単一の 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を使用します。

ご協力ありがとうございました!

4

4 に答える 4

0

個人的には、特に (Paul Tyng が提案したように) シナリオの編集と作成に共通するフィールドに基本クラスを使用する場合は、2 つのビュー モデルに問題はありません。

ただし、本当に単一のビュー モデルのみが必要な場合は、次のいずれかを行う必要があります。

  • ビュー モデルにフラグを追加し、バリデータで When() メソッドを使用します。ただし、これは適切なクライアント側のみの検証を生成しないことに注意してください
  • 2 番目のバリデーターを定義し、コントローラーから適切なバリデーターを呼び出します (つまり、「自動」バリデーションの代わりに)
于 2012-12-20T10:30:56.180 に答える
0

ページ間で機能/ユースケース/検証が異なる場合、異なるモデルを使用します。ID などの存在以外がまったく同じである場合は、同じモデルを使用します。違いがかなり小さい場合は、同じビューを使用することもできます。

あなたの検証は異なるため、私がそれを行っていた場合、必要ではないかもしれませんが、検証ですぐに使用できる DataAnnotations を使用できるように、2 つの異なるモデルを作成します。編集モデルでは、名前は編集できなくなったため、読み取り専用プロパティを持つこともできます。

于 2011-11-01T19:22:23.233 に答える
0

私の理解では、ViewModel と View の間に 1:1 の相関関係はありません。多くの場合、ViewModel を使用する必要のない View があります。

モデルを完全に並列化し、特定のビューに合わせて調整する必要がある場合にのみ、ViewModel を作成する必要があります。これは 100% の場合ではありません。

于 2011-11-01T19:21:51.553 に答える
0

私にとって、同じオブジェクトは、作成または編集されたかどうかに関係なく、主にオブジェクトの一貫性を確保するために、毎回同じ検証を行う必要があります。

検証を 1 つだけ作成し、「exists」メソッドを編集して渡して、それが新しいオブジェクトかリポジトリ内の現在のオブジェクトかを確認する必要があると思います。

于 2011-11-01T19:40:45.460 に答える