2011-11-01 1 views
3

질문

각 페이지 (`Create.cshtml`과`Edit.cshtml`)에 대한`ViewModel '?

이 개 관련 질문이 실제로 있습니다

  1. 나는 각 페이지에 대한 뷰 모델을 만들어야가?
  2. 당신은 내가

소스 (사용중인 페이지)에 따라 다른 방식으로 뷰 모델을 검증 할 수있는 방법 두 페이지 (Create.cshtmlEdit.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을 사용합니다.

도움 주셔서 감사합니다.

답변

0

필자는 ViewModel과 뷰간에 1 : 1 상관 관계가 없다는 것을 알고 있습니다. 때때로 ViewModel과 함께 갈 필요가없는 View를 가질 것입니다.

모델을 절대적으로 병행하여 특정 뷰에 맞게 조정해야하는 경우에만 ViewModel을 만들려고합니다. 이것은 100 % 시간의 경우가 아닙니다.

+0

나는 완전히 동의합니다! 두 번째 질문은 어떻습니까? 사용자가 내 ProjectValidator 클래스에서 프로젝트를 편집하는 경우 규칙을 무시하는 방법 – ridermansb

0

페이지간에 기능/사용 사례/유효성 검사가 다른 경우 다른 모델을 사용합니다. 만약 ID 나 유사 물의 존재 외에도 똑같은 모델을 사용한다면 차이점이 아주 작다면 같은 모델을 사용할 수 있습니다.

유효성이 다르기 때문에 필자는이 작업을 수행 할 때 두 개의 다른 모델을 만들어서 상자 안의 DataAnnotations를 사용할 수 있도록하고 있지만 유효성 검사는 필요하지 않을 수도 있습니다. 편집 모델에서 더 이상 편집 할 수 없으므로 name에 대한 읽기 전용 속성을 가질 수도 있습니다.

+0

나는 그가 의미하는 것을 이해하지 못했습니다. 필자는'Edit.cshtml'과'Create.cshtml'에 대한 하나의 ViewModel과이 ViewModel의 유효성을 검사하는 클래스를 가지고 있습니다. ** 내 문제 **는 사용자가 프로젝트를 편집하고있는 경우 규칙을 무시하는 방법입니다. 각 페이지에 대해 ViewModel을 만드는 방법에 관해서는 익숙하지 않습니다. 코드를 복제하는 것이 좋습니다. – ridermansb

+1

코드가 두 위치에서 동일한 작업을 수행하는 경우에만 코드를 복제합니다. 공유 기능에는 항상 기본 모델 클래스를 사용할 수 있습니다. –

0

나를 위해 동일한 객체는 객체의 일관성을 보장하기 위해 매번 동일한 유효성 검사를 수행해야합니다 (객체가 작성되거나 편집 된 경우에는 개별적으로 객체의 일관성을 보장해야합니다).

난 하나의 유효성 검사를 만들어야하고, 그것이 새로운 객체인지 또는 저장소의 현재 객체인지 확인하기 위해 "exists"메소드를 편집해야한다고 생각합니다.

+1

Charles, 유효성 검사는 편집과 생성을위한 것입니다. 책임 분리라는 개념을 사용하여 ViewModel의 유효성을 검사하는 클래스를 만들었습니다. 질문은 동일한 유효성 검사를 사용하는 방법이지만 새 레코드 인 경우 특정 규칙을 무시하는 것입니다. (위의 코드에 나열된대로). – ridermansb

0

개인적으로 두 가지보기 모델에 문제가 없습니다. 특히 시나리오 편집 및 작성에 공통적 인 기본 클래스를 사용하는 경우 (Paul Tyng가 제안한 것처럼).

  • 뷰 모델에 플래그를 추가하고 유효성 검사기의() 메소드를 사용 : 당신이 정말로에만 다음 단일 뷰 모델을 원하는 경우에

    그러나, 당신도해야합니다. 이 적절한 클라이언트 측에만 검증

  • 두 번째 검증을 정의를 생성하고 컨트롤러에서 해당 하나를 호출하지 않습니다하지만 참고 (즉, 대신 "자동"검증)