2014-03-28 2 views
0

저는 ASP.NET MVC에서 상당히 새롭고 대부분의 경우 단순한 질문을 가지고 있습니다. 그러나 무엇이 문제인지 파악할 수 없습니다. 최선의 접근법.다중 경로 동작에 대한보기/컨트롤러 접근 방식이 좋음

그래서 "메모"엔티티, 노트 컨트롤러 (표준 색인, 목록, 생성, 편집, 삭제 작업 포함) 및 노트보기가 있습니다. List 액션에 대해 말하면, 이것은 다른 소스에서 "호출"될 수 있습니다. 예 : 저는 프로젝트에 두 개의 노트가 첨부되어 있습니다. 그리고 저는이 노트를 만드는 사용자가 있습니다.

나는 4 (더 많은,하지만의 4 가정 해 봅시다)가 시나리오 :

  1. 목록 ALL 특정 사용자로부터 특정 프로젝트에 대한
  2. 목록 메모를
  3. 목록 메모 노트를
  4. 목록 노트 특정 사용자의 특정 프로젝트

결과 목록은 일부 ca에서 숨겨 질 수있는 일부 열을 제외하면 거의 비슷합니다 ses (및 상황에 맞는 메뉴 등 ..하지만 이것을 설정하는 방법을 생각해 나는 그것을 잘 처리 할 수 ​​있다고 생각합니다).

사례 1

이드 이유 양 프로젝트 사용자

사례 2

이드 이유 양 사용자

사례 3

아이디 이유 금액 프로젝트

사례 4

아이디 이유 금액

목록 액션

 public ActionResult List(int? proj_id, int? user_id) 
    { 
     int requestType = proj_id.HasValue ? 1 : 0; 
     requestType += user_id.HasValue ? 2 : 0; 

     switch (requestType) 
     { 
      case 0: //no parameters 
       return View(getNotes()); 
       break; 
      case 1: //filter by project 
       ViewData[ViewDataConst.VIEW_HIDE_COLUMN_PROJECT] = true; 
       return View(getNotesByProject(proj_id)); 
       break; 
      case 2: //filter by user 
       ViewData[ViewDataConst.VIEW_HIDE_COLUMN_USER] = true; 
       return View(getNotesByUser(user_id)); 
       break; 
      case 3: //filter by project and user 
       ViewData[ViewDataConst.VIEW_HIDE_COLUMN_PROJECT] = true; 
       ViewData[ViewDataConst.VIEW_HIDE_COLUMN_USER] = true; 
       return View(getNotes(proj_id, user_id)); 
       break; 
     } 

    } 

에 대한 그리고 내가 가진 관련 목록보기에 이것은 의사 코드 예 :

 @if (!ViewData[ViewDataConst.VIEW_HIDE_COLUMN_PROJECT]) 
    { 
     <th> Project Name </th> 
    } 

내 질문은 :이 접근법이 맞습니까? 아니면 완전한 WTF입니까? 다른 열을 처리하는보기가 여러 개 있어야합니까? 그 행동이 사실상 같다고해도? 여러 컨트롤러? ViewData는 순수한 악의입니까? :)

투옥에 대한 어떠한 회신, 조언, 제안도 환영합니다.

답변

2

먼저 무엇을 질문해야합니다 : 모든 것을 한 번의 작업으로 처리하면 어떤 이점이 있습니까?

개인적으로 볼 수 없습니다. 더욱이 당신의 접근 방식으로는 언젠가 폭발 할 때까지 성장하고 성장할 수있는 끔찍한 스위치가 있습니다. 또한 2 옵션 인은 디버깅하는 동안 문제가 될 수 있습니다.

내 조언이 같은 각 시나리오에 대해 별도의 조치를 작성하는 것입니다 :

  1. ListForProject (INT 아이디)
  2. ListForUser (INT 아이디)
  3. ListAll()
  4. ListFor (INT 사용자 ID, int projectId)

각 작업에서 정확하게 동일한보기를 반환 할 수 있습니다.

return View("SharedViewName", yourNotes); 

또한 부분적으로보기를 빌드 할 수 있으며 각 작업보다 적당한 부분에 적절한 부분을 넣을 수있는 자체보기가 있습니다. 이렇게하면보기에 'if'가 훨씬 적어집니다.보기에 'if'가 적 으면 적을수록 좋습니다.

ViewBag/ViewData에 관해서는 때때로 도움이되지만 일반적으로 간단한 ViewModel 클래스에서보기 용 데이터를 래핑하는 것이 좋습니다.

+0

알 수 있습니다. 하지만 내 생각은/Projects/1/Users/Projects/1/Notes 등과 같은 것이 었습니다. 이런 식으로 시나리오를 작성해야합니까? – AlbertoA

+0

@AlbertoA 예, 의미있는 경로를 원할 경우 개별 노선을 작성해야합니다. ListFor (int userId, int projectId)에 문제가 발생할 수 있습니다. 아마도 다음과 같이해야 할 것입니다 :/Projects//User//Notes. 열심히 노력한다면 아마도 경로를 조금 일반적으로 만들 수있을 것입니다.하지만 이것은 많은 작업이 될 수 있으며 디버깅하기에 지옥이 될 것입니다. – gisek

관련 문제