2010-04-05 3 views
0

기본 컨트롤러에서 일부 데이터를 가져 와서 목록에 저장하려는 고유 한 시나리오가 있습니다. ViewData와 마찬가지로 내보기에서 목록에 액세스 할 수 있어야합니다. 모든 페이지에서이 목록을 사용하며 ViewDataDictionary에서이 목록을 누르는 것보다 더 깨끗한 솔루션을 원합니다.ASP.NET MVC는 ViewData, ViewModel 또는 Session없이 뷰에서 컨트롤러로 정보를 전달합니다.

솔루션을 찾으려고 시도한 후에 내 목록을 보유 할 속성이있는 사용자 지정 ViewPage를 만들 것이라고 생각했습니다. 내 사용자 지정 ViewPage는 System.Web.MVC.ViewPage에서 상속됩니다. 그러나 MVC가 컨트롤러에서 뷰 데이터를 뷰로 전달하는 위치를 알 수 없습니다. 더 중요한 것은 어떻게 내 목록을보기로 전달할 수 있습니까?

도움 주셔서 감사합니다.

수정 ....

죄송합니다. 혼란을 피하기 위해 가능한 한 간단하게 질문을하려고 노력했습니다. 분명히, 그게 작동하지 않았다 :)

나는 .net mvc 프로젝트에서 내 자신의 세션 관리를 구현하고있다. 요청이 들어 오면 내 기본 컨트롤러는 세션 쿠키가 OnActionExecuting 메서드의 요청과 함께 전송되었는지 확인합니다. 세션 쿠키가 전송되면 내 컨트롤러가 데이터베이스에 도달하여 사용자의 세션 정보를 검색합니다. 세션 정보 (userid 등)는 List 객체에 저장되고 "Sess"라는 속성에 저장됩니다.

나는 이런 식으로 내보기에서 수신 세션 목록에서 요소에 액세스 할 수 있도록하려면 :

그래서, 어디에서 어떻게 내가 내 컨트롤러는 내 의견에 수신 세션 목록을 넘겨받을 수 있나요?

저는 이것이 사용자 지정 세션 관리가 일반적으로 .net에서 구현되는 방식이 아니라는 것을 알고 있습니다. 그러나 이것은 내 프로젝트를위한 가장 단순하고 청결한 솔루션이 될 것입니다.

지금까지 도움을 주신 모든 분들께 감사드립니다.

+1

RenderAction과 같은 사운드가 작업에 더 적합 할 수있는 시나리오 중 하나입니다. 모든 페이지 (예 : 메뉴)에서 렌더링해야하는 데이터가있는 경우 RenderAction을 사용하면 훨씬 쉽게 처리 할 수 ​​있습니다. 그것은 기본적으로 라이프 사이클을 거치며 공유되는 앱의 조각 부분 (메뉴, 광고, 위젯)을 처리 할 수있는 가장 쉬운 방법입니다. – Jab

+0

Jab와 동의합니다. 필요한 동적 데이터가 필요하면 RenderAction을 사용하십시오. (원하는 경우 RenderPartial에 모델을 선택적으로 제공 할 수 있습니다.) – mare

답변

0

왜 ViewData를 사용하지 않으시겠습니까? ViewDataDictionary에 일부 데이터를 넣는 모든 작업에 코드 줄을 사용하고 싶지 않기 때문입니까?

당신은 당신은 모든 컨트롤러 또는 기본 컨트롤러에이 속성을 넣어, 액션 필터를 사용하고 각 작업을 실행하기 전에 다음

public class AddSomeDataToViewDataAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //filterContext.Controller.ViewData.Add("SomeConstant")(data); 
    } 
} 

예를

을 위해 같은 데이터를 넣을 수 있습니다.

편집 :

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    //filterContext.Controller.ViewData.Add<YourListType>(data); 
} 

을 그리고보기에, 당신은 데이터를 같이 얻을 : 당신은

public static void Add<T>(this IDictionary<string, object> dictionary, T anObject) 
{ 
    var key = typeof(T).Name; 
    dictionary.Add(key, anObject); 
} 

public static T Get<T>(this IDictionary<string, object> dictionary) 
{ 
    var key = typeof(T).Name; 
    return (T)dictionary[key]; 
} 

같은 확장 방법 중 몇 가지를 할 수 그런 다음이 같은 데이터를 추가 이 :

ViewData.Get<YourListType>(); 

감사합니다.

+0

ViewData [ "Session"]을 각각 목록으로 캐스팅하지 않으려 고합니다. ASCST를 렌더링하려면 데이터 저장소를 빠져 나오거나 RenderPartial을 사용하십시오. 내 견해에 시간. – josh

+0

좋아, 내 대답을 편집했습니다. – uvita

0

질문의 답 : 일부 답변을 원하면 기본 ViewModel에서 속성을 사용할 수 있습니다. 기본 ViewModel의 생성자에서 해당 속성을 설정해야합니다.인스턴스 객체는 수행중인 작업에 대해 값을 전달해야하는 경우 명시 적으로 기본 ViewModel의 생성자를 호출해야합니다.이 생성자 호출은 일반적인 C#이므로 웹에 많은 예제가 있습니다.

나는 이것이 메뉴에 대한 것이라면 RenderAction이 기능을 구현하는 훨씬 쉬운 방법 인 것처럼 보입니다. 메뉴에 대한 기본 ViewModel 메서드를 시도한 다음 탐색을 담당하는 컨트롤러에서 RenderAction을 사용하도록 전환했습니다.

ASP.NET MVC 사이트의 동적 탐색 예제가 부족한 것은 그러한 기본적인 요구 사항처럼 보이기 때문에 놀라운 것입니다.

0

문제를 더 잘 설명해야합니다.

액션 필터 또는 Controller.OnActionExecuted 무시를 제외하고는 Html.RenderAction을 사용할 수 있습니다.

2

일반적으로보기에 액세스 할 수 있는지에 대해 명시 적으로 권하고 싶습니다. 따라서 컨트롤러의 ViewData에이 데이터를 넣은 다음 View에서 ViewData를 가져와 사용하는 것이 좋습니다. 이렇게하면 한 곳에서 컨트롤러와 뷰 사이의 의사 소통을 쉽게 유지할 수 있습니다.

그러나 실제로보기에서 세션에 액세스하려는 경우 가능합니다. 당신이 할 수

<%: ViewContext.HttpContext.Session["key"] %> 

한 가지 System.Web.Mvc.ViewPage에서 파생 사용자 정의보기 페이지 클래스를 가지고보기 페이지를 가리 키도록 페이지 상단의 상속 선언을 변경할 수 있습니다.

<%@ Page ... Inherits="YourNamespace.YourViewPage" %> 

사용자 정의보기 페이지에는 필요한 모든 속성이있을 수 있습니다.

관련 문제