ASP.NET MVC передает информацию из контроллера для просмотра без ViewData, ViewModel или Session - PullRequest
0 голосов
/ 05 апреля 2010

У меня есть уникальный сценарий, в котором я хочу, чтобы базовый контроллер взял некоторые данные и сохранил их в списке.Список должен быть доступен из моих представлений так же, как и ViewData.Я буду использовать этот список на каждой странице и хотел бы более чистого решения, чем просто вставить его в ViewDataDictionary.

После попытки найти решение, я подумал, что создам пользовательский ViewPage со свойством длядержи мой список.Мой пользовательский ViewPage будет наследоваться от System.Web.MVC.ViewPage.Тем не менее, я не знаю, где MVC передает данные представления от контроллера к представлению.Что более важно, как мне заставить его передать мой список на просмотр?

Спасибо за помощь.

РЕДАКТИРОВАТЬ ....

Извините за путаницу.Я старался сделать вопрос как можно более простым, чтобы избежать путаницы.Очевидно, это не сработало:)

Я реализую свое собственное управление сессиями в проекте .net mvc.Когда приходит запрос, мой базовый контроллер проверяет, был ли отправлен файл cookie сеанса вместе с запросом в методе OnActionExecuting.Если cookie-файл сеанса был отправлен, мой контроллер обращается к базе данных и получает информацию о сеансе пользователя.Информация о сеансе (идентификатор пользователя и т. Д.) Помещается в объект List и сохраняется в свойстве с именем «Sess».

Я хочу иметь возможность доступа к элементам в списке Sess из моих представлений, например:

Итак, как и где я могу получить свой контроллер для передачи списка Sess моим представлениям?

Я понимаю, что это не то, как пользовательское управление сессиями обычно реализуется в .net.Однако это было бы самое простое и чистое решение для моего проекта.

Спасибо всем, кто помогал до сих пор!

Ответы [ 4 ]

2 голосов
/ 08 апреля 2010

В общем, я бы порекомендовал четко указывать, к чему разрешены ваши взгляды. Таким образом, я бы рекомендовал вам поместить эти данные в ViewData с вашего контроллера, а затем вытащить их из ViewData из представления. Это сохраняет связь между вашим контроллером и представлением в одном месте и просто.

Однако, если вы действительно хотите получить доступ к сеансу из представления, вы можете.

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

Одна вещь, которую вы могли бы сделать, - это создать собственный класс страницы представления, производный от System.Web.Mvc.ViewPage, и изменить объявление Inherits вверху страницы, чтобы оно указывало на страницу просмотра.

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

Ваша пользовательская страница просмотра может иметь любые свойства, которые вам нужны.

0 голосов
/ 05 апреля 2010

Вопрос не ясен: чтобы ответить на него, вы можете использовать свойство базовой ViewModel. Вам нужно установить это свойство в конструкторе базовой ViewModel. Ваши объекты экземпляра должны явно вызывать конструктор базовой ViewModel, если ему нужно передать какие-либо значения для любой работы, которую он выполняет ... Этот вызов конструктора является обычным C #, поэтому в Интернете есть множество примеров. 1001 *

Я согласен, что если это для меню, RenderAction кажется гораздо более простым способом реализации функциональности. Я попробовал базовый метод ViewModel для меню, а затем переключился на использование RenderAction на контроллере, который специально отвечает за навигацию.

Отсутствие примеров динамической навигации для сайтов ASP.NET MVC вызывает удивление, так как это кажется таким базовым требованием.

0 голосов
/ 05 апреля 2010

Вы должны описать свою проблему лучше.

И, кроме фильтра действий или переопределения Controller.OnActionExecuted, вы можете использовать Html.RenderAction .

0 голосов
/ 05 апреля 2010

Почему вы не хотите использовать ViewData? Это просто потому, что вы не хотите, чтобы в каждом действии была строка кода, которая помещает некоторые данные в ViewDataDictionary?

Вы можете использовать фильтр действий и помещать эти данные перед каждым действием, как, например,

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

Затем вы просто помещаете этот атрибут в каждый контроллер или в базовый контроллер.

Edit: Вы можете создать несколько методов расширения, таких как

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];
}

Затем вы добавляете данные следующим образом:

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

И в представлении вы получаете такие данные:

ViewData.Get<YourListType>();

Привет.

...