MVC — Как включить модель в _Layout для частичного просмотра

#asp.net-mvc #asp.net-mvc-4 #razor

#asp.net-mvc #asp.net-mvc-4 #razor

Вопрос:

Я видел, как использовать частичные представления из представления, и я понимаю, как модель передается из представления в частичное представление. Чего я не понимаю, так это как включить частичное представление внутри _Layout.cshtml, чтобы я мог передать его частичному представлению — или как само частичное представление может вызывать действие контроллера для создания модели для использования.

В частности, я хочу включить частичное представление в _Layout.cshtml для отображения в заголовке каждой страницы. Частичное представление отобразит пользовательскую настройку в профиле пользователя. Я не могу придумать никакого способа получить модель без вызова действия контроллера — но как это делается в / для частичного просмотра из _Layout.cshtml?

Является ли мой единственный вариант доступа к действию контроллера для построения требуемой модели моего частичного представления для использования вызова jQuery? Или есть другой способ?

Ответ №1:

Ответ заключается в вызове @Html.Action() .

Похоже, вы на правильном пути.

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

Вместо этого каждый раз, когда вам нужна информация на каждой странице, вызывайте действие из вашего _Layout .

Например, у вас может быть контроллер с именем PartialsController или SharedController .

 public class PartialsController : Controller
{
    [ChildActionOnly]
    public ActionResult UserProfilePartial()
    {
        UserProfileModel model = new UserProfileModel();

        return PartialView("_UserProfile", model);
    }
}
 

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

Теперь вызовите действие из вашего представления (_Layout).

 @Html.Action("UserProfilePartial", "Partials")
 

Комментарии:

1. Роуэн и Тайсон, я использовал практически тот же подход, что и Роуэн (спасибо за подробности), и он работает — пока я не отправляю форму. Например, это работает, когда отображается страница входа в систему, но когда я нажимаю кнопку отправки для входа в систему, мой PartialView не найден. Возврат [HttpPost] частичного представления равен return PartialView(); . Вы показываете GET, как мне вернуться из действия POST Controller?

2. return PartialView("_UserProfile", model); Похоже, то же самое работает в сообщении.

3. Трудно ответить, не зная, что вы пытаетесь сделать. Возможно, вам придется опубликовать еще один вопрос, указав требования к HttpPost и, возможно, со скриншотами / рисунками, чтобы продемонстрировать, что вы делаете.