2012-05-16 2 views
2

ASP.NET MVC에 익숙하지 않아 코드 재사용 및 유지 관리의 이점을 이미보고 있습니다. previous question on routing을 물어볼 때, 나는 나의 생각에 대한 또 다른 아이디어를 가지고 있었지만 그것을 구현하는 방법을 확신 할 수 없었다.ASP.NET MVC의 매개 변수를 사용하여 다른 뷰에서 뷰 재사용

질문 : 질문 :보기 페이지와 컨트롤러를 별도의 페이지에서 재사용 할 수 있습니까? 또한 표시 할 문제점 수와 같은 특정 항목에 대한 매개 변수가 있습니까?

예 : 웹 응용 프로그램에 문제 목록을 표시하고 싶습니다. 이러한 문제는 프로젝트별로 그룹화됩니다. 따라서 www.example.com/projectname/issues로 이동하면 해당 프로젝트의 문제점 목록이 표시되고 www.example.com/issues로 이동하면 모든 프로젝트의 모든 문제가 표시됩니다. 제가하고 싶은 것은 www.example.com/projectname에 가면 마지막 10 개 문제를 포함하여 프로젝트에 대한 정보를 볼 수 있다는 것입니다.

어떻게이 코드를 재사용 할 수 있습니까? Partial View에 대한 옵션이 있지만 구현할 때 코드를 라우팅하는 방법을 알지 못했습니다. Web Forms에서는 ASP.net 컨트롤을 만들고 코드의 일부 매개 변수를 설정 한 다음이 컨트롤을 다른 위치에 포함 할 수 있습니다.

내가 지금까지 발견 한 예제 중 일부는 ASP.NET MVC 3에서 나에게 적합하지 않은 오래된 MVC 코드처럼 보이지만 (다른 페이지에서 일부 HTMl을 추가하는 것 이상의) 완벽한 구현이 부족하다는 것을 알았습니다 매개자를 지정하고 이러한 재사용 유형을 보여줄 수는 없습니다.

여기 내 용어가 완전히 올바르지 않을 수 있습니다. 뭔가가 있다면 ASP.net Web Forms User Controls 같은 것을 복제하는 최선의 방법 (MVC 읽기)을 찾으려고합니다. 마찬가지로, '이슈'코드 (HTML 및 C#)를 '마스터'문제 목록과 문제 '위젯'모두에서 다시 사용하는 경우

+1

경로로 마법을 쓸 수 있습니다. 내 책의 첫 번째 단계는 {project}/{controller}/{action}에 대한 경로를 등록하고 "프로젝트"가 존재하는지 확인하는 경로 제한을 만드는 것입니다 (ID 또는 문자열). 거기에서 기본 컨트롤러를 만들고 Initalize 이벤트를 사용하여 경로 값에서 데이터를 읽고 프로젝트를 채 웁니다. 거기에서 프로젝트의 ID 나 이름을 전달하는 액션의 속성을 읽을 수 있습니다. –

+0

내 혼란이 문제를 코드를 재사용하는 방법에 달려있다. 나는 이미 좁은 문제에 대한 라우팅과 비슷한 것을 가지고있다. 그것의 moreso 지금 어떻게 프로젝트 페이지에 작은 문제 목록을 표시 할 수 있습니다. – jmlumpkin

+0

PartialView를 찾고 있다고 생각합니다 –

답변

3

내에서이 라인은 꺼지고 그것의 데이터에 액세스 뷰에 유혹 쓰기 코드를 건너 뛰기 개인적인. RenderAction과 같은 내장 함수를 사용하는 것도 포함됩니다. RenderAction이 다른 컨트롤러를 실행하기 위해 "돌아 간다"고해서 뷰 자체가 아무런 조치도 취하지 않고 모델에 이 포함되어 있다고 가정되는 MVC 접근 방식을 깨뜨릴 수 있습니다.보기가 필요합니다.

public class IssueListModel { 
    public List<Issue> Issues { get; set; } 
} 

가 문제 목록 행동에 채우기 :

public ActionResult IssueList(string projectName) // projectName may be null 
{ 
    var issueListModel = new IssueListModel(); 

    issueListModel.Issues = SomeRepository.GetIssues(projectName); // whatever you need to send... 


    return View(issueListModel); 
} 

대신 당신이 무엇을 할 수 있는지 문제의 목록을 포함하는 속성이 포함 된 문제 목록 페이지 (들)에 대한 모델을 다시 보낼 것이다

@foreach (var issue in Model.Issues) { 
    <div>@issue.IssueName</div> 
} 

또는 공동 : 목록 페이지에 다음

그럴 수 루프 그것을 통해 부분보기에 그것을 통해 다음 루프를

@model List<MyProject.Models.Issue> 

... 그리고 :

@Html.RenderPartial("IssueList", Model.Issues) 

당신은 모델로 목록을 기대하는 당신의 부분보기를 입력 할 수 있습니다 자민련은 부분보기로 아래로 문제 모음을 보내 모델 자체에 foreach는 일이 시간 :

@foreach (var issue in Model) { 
    <div>@issue.IssueName</div> 
} 

이 그럼 당신은 무엇을 할 수 있는지 또한 문제를 포함하는 속성이 포함 된 프로젝트 상세보기에 대해 별도의 모델을 만들 수 있습니다 :

public ActionResult ProjectDetail(string projectName) 
{ 
    var projectDetailModel = new ProjectDetailModel(); 

    projectDetailModel.Issues = SomeRepository.GetIssues(projectName, 10); // whatever you need to send 


    return View(projectDetailModel); 
} 

그런 다음 당신은 당신의 ProjectDetail보기에 똑같은 부분 뷰를 다시 사용할 수 있습니다 : 당신이 당신의 목록 컨트롤러에 채우는 것과 같은 기능을 사용하여이 목록을 채울 수 있습니다 컨트롤러에서

public class ProjectDetailModel { 
    public Project Project { get; set; } 
    public List<Issue> Issues { get; set; } 
    public string Whatever { get; set; } 
} 

:

@Html.RenderPartial("IssueList", Model.Issues) 

긴 대답이지만이 정보가 도움이되기를 바랍니다.

+0

이것은 가깝지만 마지막 큰 다음 "이 사전에 전달 된 모델 항목은 'System.Web.Mvc.ViewResult'유형이지만이 사전에는 '모델'유형의 모델 항목이 필요합니다. Issues ' " – jmlumpkin

+0

또한이 경우 두 개의 작업, 즉'프로젝트 '페이지에 대한 작업과'Issues '부분보기에 대한 작업 중 하나를 수행 할 것입니까? 부분보기에 자체 코드가있는 온라인과 같은 좋은 예제를 찾을 수없는 것 같습니다. – jmlumpkin

+0

아, 알아 냈어! 실제 Object 대 ActionResult를 반환했기 때문입니다. 이제는 제대로 작동합니다. 이 경우 모든 것이 Object 대 ViewBag에 포함되어야한다고 생각합니까? – jmlumpkin

0

컨트롤러 메서드에서보기가 아닌 이름이 지정된보기를 반환합니다. 당신은 단지 프리젠 테이션 로직을 재사용하려면보기() 즉

...

public ViewResult IssueView1() 
{ return View("Issue");} 

public ViewResult IssueView2() 
{return View("Issue");} 
+0

별도의 * 작업 *에서 다른보기를 표시하는 방법을 설명합니다. 그것은 별도의 * 뷰에서 다른 뷰를 표시하는 방법을 다루지 * 않습니다 *. –

+0

음, 내 용어가 정확하지 않을 수 있습니다. 비록 이것을 사용하더라도, 나는이 하위 뷰에 매개 변수를 전달하는 방법에 대해 더 많이 알아야 할 것입니다. 여러 하위 뷰를 사용하는 경우 등 – jmlumpkin

+0

무엇을 전달해야합니까? 프로젝트를 전달하는 것에 대해 걱정이된다면 ViewContext RouteData Values에서 사용할 수 있습니다. HTML이나 URL 헬퍼에 내장 된 링크를 사용하여 경로 값이 이미 존재하고 생성 된 URL의 URL 구조가 올바른지 확인하십시오. –

2

, 당신은 부분보기를 사용할 수 있습니다. 컨트롤러의 로직을 다시 사용하려면 부분 뷰와 결합 된 하위 동작을 사용해야합니다.

폴더 문제에서 적절한 부분보기라는 이름의 목록을 작성하는 것도 잊지 마세요 컨트롤러

public class IssuesController : Controller 
{ 
    [ChildActionOnly] 
    public PartialViewResult List(string projectName, int issueCount = 0) 
    { 
     IEnumerable<Issue> issueList = new List<Issue>(); 

     // Here load appropriate issues into issueList 

     return PartialView(issueList); 
    } 
} 

을 만듭니다.

마지막으로 프로젝트보기

@{ Html.RenderAction("List", "Issues", new { projectName = "Px", issueCount = 10 }); } 

내에서이 줄을 사용하여 문제 목록보기

@{ Html.RenderAction("List", "Issues", new { projectName = "Px" }); } 
관련 문제