2009-09-02 2 views
3

모델 바인딩을 사용하여 MVC에서 ASP.NET 프로필 설정을 편집하는 좋은 예가 있는지 궁금합니다. ASP.NET 모델 바인딩을 ProfileCommon

현재 내가 가진 : ProfileBase에서

  • 사용자 정의 ProfileCommon 클래스를 파생.
  • (유형이 ProfileCommon 인) 강력한 유형의보기
  • ProfileCommon 및 관련보기에서 작동하는 컨트롤러의 작업을 가져오고 게시하십시오. (아래 코드 참조).

프로필 세부 정보보기 - 양식이 모든 입력란이 올바르게 채워진 것처럼 보입니다.

그러나 양식을 저장하면 예외가 발생합니다. System.Configuration.SettingsPropertyNotFoundException : 설정 속성 'FullName'을 찾을 수 없습니다.

모델 바인딩이 httpcontext 중 하나를 잡는 대신 ProfileCommon 클래스 자체를 인스턴스화하기 때문에이 점을 고려해야합니다. 또한 프로파일이 수정 될 때 자동으로 프로파일을 저장한다고 생각하므로 저장이 중복 될 수 있습니다. 권리?

어쨌든, 현재 나의 생각은 모델 바인딩을 위해 별도의 Profile 클래스를 생성해야하지만, 이미 매우 유사한 클래스가있을 때 약간 중복되는 것처럼 보입니다.

어딘가에 좋은 예가 있습니까? 그것의 기본에 따라 유형의 새 인스턴스를 생성 : -

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit() 
    { 
     return View(HttpContext.Profile); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(ProfileCommon p) 
    { 
     if (ModelState.IsValid) 
     { 
      p.Save(); 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      return View(p); 
     } 
    } 

답변

3

당신이 ProfileCommon 인스턴스가 포스트 시나리오에서 스크래치 (안으로 HttpContext에서)에서 생성되는 것을 말할 때 그것은 올바른 소리는 그 어떤 DefaultModelBinder가하는이다 건설자.

난 당신이 이런 식 사용자 정의 IModelBinder를 만들어이 문제를 해결할 수 있다고 생각 :

public class ProfileBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
    { 
     return controllerContext.HttpContext.Profile; 
    } 
} 

당신은 그것이 당신의 프로필 클래스에 맞게 만들기 위해 약간의 캐스팅을 할 필요가 있습니다.

public ActionResult Edit([ModelBinder(typeof(ProfileBinder))] ProfileCommon p) 
+0

감사합니다 마크, 내가 그 아마 일 것이라고 생각하지만 난이 잘못된 방법을 시도하는 것 같아 :

이 ProfileBinder를 사용하려면 다음과 같이 당신의 편집 컨트롤러 액션에 추가 할 수 있습니다 . 문제는 ProfileCommon 클래스에 대한 유효성 검사가 실패한 경우 변경 사항이 이미 적용되어 더티로 표시되고 어쨌든 작성된 것입니다. 나는 ProfileCommon 클래스에 적용 할 유효성 검사 논리와 메서드가있는 두 번째 유사한 클래스 (ProfileEdit)를 사용하여이 문제를 해결했습니다. 더 많은 코드가 있지만 멋지게 분리되어 작동합니다. –

관련 문제