2012-08-24 4 views
3

MVC 프로젝트에서 모델을 관리하는 가장 좋은 방법과 관련된 두 가지 질문이 있습니다.ASP.NET MVC의 모범 사례

  • 내 모델을 초기화하는 데 생성자를 사용할 수 있습니까? (분명히 관련된 로직과 함께)? 이를 위해
  • 는 "생성자 방법"을 사용하는 것이 좋습니다, 아니면 새로운 모델 인스턴스의 생성 후에 컨트롤러에 의해 호출 확장 방법을 사용 하는가?

예를 들어 나는 문의 양식의 모델을했습니다. 사용자는 익명, 클라이언트 또는 공급 업체의 세 가지 역할을 수행 할 수 있으며 각 주에서 양식을 제출할 수 있습니다. 내가 원하는 유일한 것은 사용자가 클라이언트의 역할이나 공급 업체의 역할과 같이 로그인 한 경우 텍스트 상자에 미리로드하려는 것입니다.

using System; 
using System.Web; 
using System.Web.Security; 
using DrOkR2.Bll.Managers; 

namespace DrOkR2.WebFront.Models 
{ 

    public class RequestModel 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Phone { get; set; } 
     public string Email { get; set; } 
     public string Prov { get; set; } 
     public string Request { get; set; } 
     public bool UsageConditions { get; set; } 

     public RequestModel() 
     { 
      if (!HttpContext.Current.User.Identity.IsAuthenticated) return; 
      if (HttpContext.Current.User.IsInRole("Client")) 
      { 
       var guid = (Guid)Membership.GetUser().ProviderUserKey; 
       var manager = new ClientManager(); 
       var client = manager.GetClient(guid); 
       client.Email = Membership.GetUser().Email; 

       FirstName = client.FirstName; 
       LastName = client.LastName; 
       Email = client.Email; 
       Phone = client.Phone; 
       Prov = client.Prov; 
      } 
      else if (HttpContext.Current.User.IsInRole("Supplier")) 
      { 
       var guid = (Guid)Membership.GetUser().ProviderUserKey; 
       var manager = new SupplierManager(); 
       var supplier = manager.GetSupplier(guid); 
       supplier.Email = Membership.GetUser().Email; 

       FirstName = supplier.FirstName; 
       LastName = supplier.LastName; 
       Email = supplier.Email; 
       Phone = supplier.PrimaryPhone; 
       Prov = supplier.BusinessProv; 
      } 
     } 
    } 
} 

그것은 완벽하게 작동하지만, 내 질문은 : 나는 최상의 방법을 사용하고 들어 내가이 코드를 작성했습니다이 있습니까?

+0

그것이 의미가있다 . –

+0

잘못된 개체를 가질 수 없습니다. 내가 가질 수있는 최악의 상황은 빈 연락처 양식으로 로그인 한 사용자입니다. 문제는 "사용자 로그인 논리가 여기에 올바르게 배치되었거나 확장 방법으로 이동해야합니까?" – G10

+0

@ ThiagoCustodio 뷰 모델을'HttpContext'와 연결하는 것이 당신에게 의미가 있습니까? – James

답변

5

아니, 당신은 HttpContext에 대한 종속성이나 모델에 모든 데이터 액세스 권한이 있어야합니다. 모델 바인딩을 통해 모든 종류의 문제에 이르기까지 자신을 개방하고 있습니다 (밀접하게 결합 된 것은 말할 것도 없음).

는 컨트롤러에서 모델 속성을 설정하거나 컨트롤러에서 사용하는 저장소.

public ActionResult Contact(string id) 
{ 
    var client = _repository.GetClient(id); 
    var model = new RequestModel(){ /* set your properties from client */ }; 

    return View(model); 
} 
1

내보기 좋아요.보기 모델에 비즈니스 로직이 너무 많습니다. 또한 뷰 모델을 HttpContext으로 연결하는 것은 좋지 않습니다.

이러한 종류의 초기화는 컨트롤러에 속합니다.

public class RequestModel 
{ 
    public string FirstName { get; set; } 
    .... 
} 

public ActionResult ContactForm(...) 
{ 
    var contactModel = new RequestModel(); 
    if (User.IsInRole("Client")) 
    { 
     ... 
    } 
    else if (User.IsInRole("Supplier")) 
    { 
     ... 
    } 

    return View(contactModel); 
} 
+0

귀하의 코드는이 문제에 대한 제 prevuos 솔루션이었습니다. 하지만 내 양식은 뷰에서 직접 볼 수있는 부분 뷰가 아니며 많은 다른 페이지에서 호출해야합니다. 이런 이유로 나는 컨트롤러 로직을 매번 관리하고 싶지 않습니다. – G10

+0

@ G10은 로직을 비즈니스 로직 클래스로 옮기고 필요한 각 컨트롤러에서 다시 사용할 수 있습니다.당신은 재사용 가능한 방법이 코드를 위로 포장 또는 기본 컨트롤러를 소개하고 시스템 전체에 대한 액세스 권한이 있으므로 거기에 방법을 배치 할 수 있도록 – jrummell

+0

는 G10 @ 부분 뷰는 여전히 컨트롤러를 통해 올 필요가있다. – James

0

나는 이것을 깨달았다. 완성 된 실을 위해 여기에 넣었습니다. 어떠한 제안? 모델 :

public class RequestModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Phone { get; set; } 
    public string Email { get; set; } 
    public string Prov { get; set; } 
    public string Request { get; set; } 
    public bool UsageConditions { get; set; } 

    public RequestModel(DrOkUser user) 
    { 

     if (user == null) return; 
     var type = user.GetType().Name;   //Client o Supplier 
     Email = user.Email; 
     if (type == "Client") 
     { 
      FirstName = ((Client)user).FirstName; 
      LastName = ((Client)user).LastName; 
      Phone = ((Client)user).Phone; 
      Prov = ((Client)user).Prov; 
     } 
     if (type == "Supplier") 
     { 
      FirstName = ((Supplier)user).FirstName; 
      LastName = ((Supplier)user).LastName; 
      Phone = ((Supplier)user).PrimaryPhone; 
      Prov = ((Supplier)user).BusinessProv; 
     } 
    } 
} 

컨트롤러 방법 :

public class HomeController : BaseController 
{ 
public ActionResult Assistance() 
    { 
     var user = GetCurrentUser(); 
     var mdl = new RequestModel(user); 
     return View(mdl); 
    } 
} 

과 BaseController : 당신이 잘못 객체를 생성하지 않습니다 때문에 나를 위해

public class BaseController : Controller 
{ 
public DrOkUser GetCurrentUser() 
    { 
     if (!HttpContext.User.Identity.IsAuthenticated) return null; 
     DrOkUser user = null; 
     var guid = (Guid)Membership.GetUser().ProviderUserKey; 
     if (HttpContext.User.IsInRole("Client")) 
      user = ClientManager.GetClient(guid); 
     if (HttpContext.User.IsInRole("Supplier")) 
      user = SupplierManager.GetSupplier(guid); 

     user.Email = Membership.GetUser().Email;    
     return user; 
    } 

}

관련 문제