2014-02-12 1 views
8

에이 일반적인 건축 질문 더 : 내 프로그래머는 "ViewBags"를 사용하기 위해 이미 모델을 받아보기로 데이터를 전달하는 것이 괜찮은지 여부를 결정하기 위해 노력하고있어ViewBag는 모델 대, MVC.NET

.

접근 1 :

MODEL A: 
- List of Employees 
- Nullable integer, indicating which item from the list is currently selected 
- string firstName (empty if index is null) 
- string lastname (empty if index is null) 

접근법 2 :

MODEL A: 
- List of Employees 

ViewBag: 
- ViewBag.Index (indicating which item from the list is currently selected) 
- ViewBag.FirstName 
- ViewBag.LastName 

내 개인적인 취향 ViewBags을 피하고 뷰가 필요한 모든 데이터를 포함하는 강력한 모델을 구축하는 것입니다

누구나 Approach2가 appr보다 나은 이유는 누구나 생각할 수 있습니까? 오크 1?

입력 해 주셔서 감사합니다.

답변

2

사용 주실 수 있습니다. 확실한. 사용해야합니까? 당신이 무엇을하려고하는지에 달려 있습니다. 일반적으로 ViewBag는 페이지 제목과 같은 데이터를 전송하도록 예약되어 있습니다. 모델의 데이터베이스에서 채워진 매개 변수를 유지하려고합니다. 주로 모델 바인딩뿐 아니라 모델 유효성 검사를 수행하고 싶었 기 때문입니다.

3

때보기의 레이아웃에 정보를 전달

개인적으로
5

모델은 강력한 타입이기 때문에 내가 그것을 볼 수 전달할 때, 우리는 또한 우리의 매개 변수에 유효 여부를 제어 할 수 있습니다, 매개 변수로 모델을 선택합니다 필드 키워드. 그리고 모델은 향후 코드 유지 관리를위한 최선의 방법입니다. 이것에 대한

참조 :

Avoid Viewbag

0

그것은 하나의 통과하고자하는 분야가 바로이 특정보기에 사용되며 그들이 엔티티의 일부로서 할 수 없습니다 경우 시나리오가 무엇인지 달려있다 또는 모델을 다음 viewbags 그렇지 않으면 내가 그것을 모델로 만들 것이라고 갈 것입니다. 제 생각에는

+2

구체적으로 답변을 명확히하고십시오 : 당신이 ViewBag를 사용해야한다면, 나는 이런 식으로 뭔가를 권 해드립니다

class SomeOtherClass { public string UserID { get; set; } // someone uses a string... } ViewBag.UserID = someOtherClassObj.UserID; // now you're in trouble. 

을 : 덜 분명 누군가가 실수로 string 또는 Nullable<int>ViewBag.UserID를 설정할 수 있다는 것입니다 왜 당신이 단지 의견이 아니라 무엇을 선택하는지에 대한 구체적인 추론. –

11

, 당신이해야 아주, 아주 좋은 이유없이 결코 사용ViewBag. Brad Thomas' answer은 그러한 좋은 이유 중 하나의 드문 예를 지적합니다.

전체 웹 사이트에서 공유하는 layout (또는 partial view)과 각자 자신의 모델이있는 수십 개의 강력한 유형의보기가 있다고 가정 해 보겠습니다. 어떻게 레이아웃에 데이터를 전달합니까? 내가 본 몇 가지 전략 :

  1. 모든 모델에 레이아웃 속성을 추가하십시오.

많은 모델이 없거나 하나 또는 두 개의 추가 속성 만 있으면 작동 할 수 있습니다. 이것은 신속하게 유지 보수의 악몽이 될 수 있습니다.

  1. 모든 모델이 레이아웃 데이터를 보유하는 클래스에서 상속 받도록하십시오.

나는 ModelBase 클래스를 만들지는 않지만 가끔 필요할 수 있습니다.

  1. 레이아웃 및 일반 모델 기본 클래스에 대한 모델을 만듭니다.

모든보기에서 활용할 수있는 여러 레이아웃의 MVC 앱을 보았습니다. 모델이 기본 클래스에서 상속하는 경우 각 레이아웃에 대한 기본 클래스가 필요할 수 있습니다. 노력의 중복을 피하기 위해 각 레이아웃에 대한 레이아웃 모델을 작성했습니다. 그렇다면이 같은 당신을 위해 작동 될 수 있습니다

abstract class ModelBase<TLayout> { 
    public TLayout Layout { get; set; } 
} 

class Model : ModelBase<LayoutModel2> { /* model stuff here */ } 
ViewBag
  • 넣고 레이아웃 속성
      을.

    레이아웃 정보를 모델에 올리는 것이 올바른 호출이 아닌 경우가 드물기는합니다. 사람들이 자신의 도메인 모델을 모델로 사용하는 것은 흔한 일이며 레이아웃 /보기 데이터를 비즈니스/도메인 데이터와 혼합하고 싶지 않을 수도 있습니다. 당신이 ViewBag을 사용하기로 결정한 경우


    ,이를 방지 :

    ViewBag.Title = "My page" 
    ViewBag.UserID = 123 
    ViewBag.UserName = "admin" 
    ViewBag.UserDisplayName = "Administrator" 
    

    명백한 잠재적 인 문제 (예를 들어 UserId 대신 UserID의) 다른 장소에서 다른 대문자를 사용하여 같은있다.

    ViewBag.LayoutModel = new LayoutModel { UserID = User.ID, UserName = User.Name }; 
    
  • +1

    또한 해당 .cshtml 파일의 맨 위에있는 원래 형식으로 즉시 다시 캐스팅하면 ViewBag의 문제가 조금 완화됩니다. – foresightyj