Частичное представление сложности ASP.NET MVC - PullRequest
0 голосов
/ 26 декабря 2011

В частичном представлении мне нужно получить доступ к Session переменной LoginInfo, которая содержит LoginInfo объект Я попробовал следующее:

@LoginInfo info = @(LoginInfo)Session["LoginInfo"]

Но это дает мне ошибки компилятора. Что я делаю не так?

1 Ответ

14 голосов
/ 26 декабря 2011

Что я делаю не так? \

Многое. Первое, что вы сделали неправильно, это синтаксис Razor. Должно быть:

@{ LoginInfo info = (LoginInfo)Session["LoginInfo"]; }

Но это только синтаксис. У тебя гораздо большая проблема. У вас проблема с дизайном. Вы нарушаете схему MVC.

Представление не должно пытаться получить какие-либо данные. Представление использует данные, которые передаются ему из действия контроллера в форме модели представления.

Итак, вы определяете модель вида:

public class MyViewModel
{
    public LoginInfo LoginInfo { get; set; }
}

тогда у вас есть действие контроллера:

public ActionResult Foo()
{
    var model = new MyViewModel();
    model.LoginInfo = (LoginInfo)Session["LoginInfo"];
    return View(model);
}

тогда у вас есть строго типизированное представление, в котором вы используете модель представления:

@model MyViewModel
<div>Hello @Model.LoginInfo.FirstName</div>

Но в этом случае (учитывая название класса LoginInfo) я предполагаю, что вы пытаетесь отобразить какой-то общий виджет во всех представлениях. Это было бы отличным кандидатом на использование Html.Action helper .

Таким образом, вы определяете действие контроллера, которое будет извлекать эту информацию из некоторого источника данных (в вашем случае Session):

[ChildActionOnly]
public ActionResult LoginInfo()
{
    var model = (LoginInfo)Session["LoginInfo"] ?? new LoginInfo();
    return PartialView(model);
}

и затем вы определяете соответствующий частичный:

@model LoginInfo
<div>Hello @Model.FirstName @Model.LastName</div>

и, наконец, в вашем _layout вы можете включить этот виджет где-нибудь:

@Html.Action("LoginInfo", "SomeController")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...