2012-07-06 2 views
2

웹 응용 프로그램의 디자인 작업 중입니다. 응용 프로그램은 원래 나로 코딩되지 않았으며 디자인 작업을하는 동안 컨트롤러 나 모델을 수정하지 않기 위해 최선을 다하고 있습니다.모델에서 부분 뷰로 정보를 가져 오기

현재 응용 프로그램은 현재보고있는 프로젝트의 이름과 프로젝트의 완료 날짜를 표시해야하는 헤더입니다. 이 머리글은 레이아웃에서 호출하는 부분 뷰이며 부분 뷰입니다. 머리글은 프로젝트 세부 정보보기와 별도의보기이므로이 정보를 끌어내는 데 어려움을 겪고 있습니다.

컨트롤러에 대한 @model 참조를 헤더에 추가하려고 시도했지만 잘못된 유형으로 전달하는 오류가 발생했습니다 (아래 오류 참조).

헤더를 호출하는 레이아웃보기 내에서 @ Html.Partial 호출에 모델을 전달하려고 시도했습니다 (this). 프로젝트 세부 사항 헤더는 전체 응용 프로그램의 레이아웃의 일부이기 때문에 볼에

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[OST.Pride.Business.Models.Project]', but this dictionary requires a model item of type 'OST.Pride.Web.Models.AdminProjectUserEdit'. 

난 그냥 헤더를 이동할 수 없습니다 : 내가 시도 일반적으로 모든 날이 오류를 가져옵니다. 나는 이것에 누구의 도움을 주셔서 감사하겠습니다, 나는 그것에 잠시 붙어 있었어요.

이 헤더는

<header id="main-header"> 
    @Html.Partial("LayoutTemplates/Header") 
</header> 

헤더 레이아웃에서 호출되는 :

<div class="navbar" style="padding-top:15px;"> 
    <div class="navbar-inner"> 
     <div class="container" style="width:auto;">   
      <div class="project-navbar"> 
       <h3><ul class="nav pull-left">Customer: TEST </ul></h3> 
       <h3><ul class="nav" style="padding-left:40%;">Project: //This is where the project name needs to be//</ul></h3> 
       <h3><ul class="nav pull-right" align="center">Project Completion Date: //Again, I need to pull the completion date here// </ul></h3> 

      </div> 
     </div> 
    </div> 
</div> 

컨트롤러의 방법

public ActionResult Details(int? projectid, int? ProjectID, int? projectuserid) // based on the project id, populates the view with the roles, project users, and the roles for the screen. 
     { 
      var model = new Models.AdminProjectUserEdit(); 

      model.Project = storeDB.Projects.Find(ProjectID); 
      model.Users = storeDB.Users.ToList(); 

      model.Surveys = storeDB.Surveys.Include("SurveyType").ToList(); 
      model.ProjectUsers = storeDB.ProjectUsers.Include("Project").Include("User").Where(x => x.ProjectID == projectid).ToList(); 
      return View(model); 
     } 

답변

1
대린의 대답은 정말 좋은 일이고 아주 잘 다른 상황에서 더 잘 작동 할 수 있지만, 내 상사 A에서 제안으로 가기로 결정

ViewBag를 사용하십시오. 이 방법을 사용한다는 것은 모델을 헤더에 전달할 필요가 없다는 것을 의미합니다. 공유 뷰입니다.

헤더가 레이아웃에

<header id="main-header"> 
    @Html.Partial("LayoutTemplates/Header") 
</header> 

헤더

<div class="navbar" style="padding-top:15px;"> 
    <div class="navbar-inner"> 
     <div class="container" style="width:auto;" > 

     @if (@ViewBag.projectName == null) 
     { /**do nothing**/ } 
     else 
     { 

      <div class="project-navbar"> 
       <h3><ul class="nav pull-left">Customer: TEST </ul></h3> 
       <h3><ul class="nav" style="padding-left:40%;">Project: @ViewBag.projectName</ul></h3> 
       <h3><ul class="nav pull-right" align="center">Project Completion Date: @ViewBag.projectCompletion </ul></h3> 

      </div> 
     } 
     </div> 
    </div> 

컨트롤러의 메소드를 호출되고 : 여기

내가 내 코드에이 방법을 구현하는 방법이다

public ActionResult Details(int? projectid, int? ProjectID, int? projectuserid) // based on the project id, populates the view with the roles, project users, and the roles for the screen. 
    { 
     var model = new Models.AdminProjectUserEdit(); 

     model.Project = storeDB.Projects.Find(ProjectID); 
     model.Users = storeDB.Users.ToList(); 

     model.Surveys = storeDB.Surveys.Include("SurveyType").ToList(); 
     model.ProjectUsers = storeDB.ProjectUsers.Include("Project").Include("User").Where(x => x.ProjectID == projectid).ToList(); 
     ViewBag.projectName = storeDB.Projects.Find(ProjectID).ProjectName; 
     ViewBag.projectCompletion = storeDB.Projects.Find(ProjectID).ProjectCompletion; 
     return View(model); 
    } 
3

여기에는 몇 가지 고려 사항이 있습니다. 이것을 레이아웃 내부에 배치하기 때문에 응용 프로그램의 모든보기에 프로젝트 세부 정보가 표시됩니다. 그러나 프로젝트 세부 사항을 표시하려면 먼저 프로젝트가 있어야합니다. 프로젝트가 있으려면 프로젝트 ID가 있어야합니다. 이 논리를 따르면, 이것은 차례로 각 요청마다 프로젝트 ID가 있어야 함을 의미합니다. 이 프로젝트 ID는 요청 쿼리 문자열 또는 경로의 일부일 수 있습니다. 이 데모의 목적을 위해이 데이터가 경로 데이터의 일부라고 가정합니다.

그래서 당신은 부분보기 대신 레이아웃 내부 프로젝트의 세부 사항을 표시 할 child action을 사용할 수 있습니다 : 우리는 경로 데이터에서 projectId 매개 변수를 전달하는 방법을

<header id="main-header"> 
    @Html.Action("Header", "SomeController", new { projectid = ViewContext.RouteData["projectid"] }) 
</header> 

공지 사항. 프로젝트 ID가 쿼리 문자열 또는 쿠키에 있거나 쿠키를 유지하기로 결정한 경우이 코드를 변경해야합니다. 경로는 좋은 장소처럼 보입니다.우리는 프로젝트의 세부 사항을 렌더링 해당 Header.cshtml 부분보기 내부에 다음

[ChildAction] 
public ActionResult Header(int? projectId) 
{ 
    if (projectId == null) 
    { 
     return PartialView(); 
    } 
    var project = storeDB.Projects.Find(projectID); 
    return PartialView(project); 
} 

과 :

그래서 우리는 프로젝트를 가져오고 해당 부분보기에 전달됩니다 Some 컨트롤러의 Header 아이 액션 동작을 호출 :

@model Project 
@if (Model == null) 
{ 
    // there wasn't any project selected => display some default stuff 
    <div>No project to display</div> 
} 
else 
{ 
    <div class="navbar" style="padding-top:15px;"> 
     <div class="navbar-inner"> 
      <div class="container" style="width:auto;">   
       <div class="project-navbar"> 
        <h3> 
         <ul class="nav pull-left"> 
          Customer: TEST 
         </ul> 
        </h3> 
        <h3> 
         <ul class="nav" style="padding-left:40%;"> 
          Project: 
          @Html.DisplayFor(x => x.Name) 
         </ul> 
        </h3> 
        <h3> 
         <ul class="nav pull-right" align="center"> 
          Project Completion Date: 
          @Html.DisplayFor(x => x.CompletionDate) 
         </ul> 
        </h3> 
       </div> 
      </div> 
     </div> 
    </div> 
} 
+0

감사합니다. 도움 주셔서 감사합니다. 나는 이것이 내가 정확히 필요한 것이라고 확신한다. 나는이 프로젝트를 올바르게 구현하는 방법을 알아 내야 만한다. 나는 너를 최신 상태로 유지할 것이다. – LemonFlip

+0

projectID 매개 변수는 경로이므로 지금은이를 적용하기 위해 작업하겠습니다. 그에 따라 답변을 업데이트하고 싶다면, 그렇지 않으면 아직 모든 것을 실행하고 실행 한 후에도 마킹을 할 계획입니다. 다시 한번 감사드립니다. – LemonFlip

+0

답변이 업데이트되었습니다. –

관련 문제