2017-02-03 5 views
0

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

Макет страницы

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>@ViewBag.Title - My ASP.NET Application</title> 
    @Styles.Render("~/Content/css") 
    @Scripts.Render("~/bundles/modernizr") 
</head> 
<body> 
    <div class="header"> 
     <div> 
      @Html.Partial("_Header") 
     </div> 
    </div> 
    <div class="container body-content"> 
     @RenderBody() 
     <hr /> 
     <footer> 
      <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p> 
     </footer> 
    </div> 

    @Scripts.Render("~/bundles/jquery") 
    @Scripts.Render("~/bundles/bootstrap") 
    @RenderSection("scripts", required: false) 
</body> 
</html> 

Частичный вид

@model TicketPaymentsAzureMVC.Models.Client 

<h1>Header</h1> 
<img src="@Url.Content(Model.BannerUrl)" alt="Image" /> 
+0

Вы получаете ошибку? В чем проблема? вы устанавливаете свойство BannerUrl в модели? –

+0

Нет ошибки, я думаю, я не уверен, как и где нужно установить свойство.Использует ли частичный вид свой собственный контроллер? Где я могу выполнить свою логику и перейти к ней? –

+0

Я ответил на ваш вопрос. Я думаю, что сделать вызов AJAX в макете - лучший способ пойти. Частичные представления используют ту же модель (или подмножество модели), которая у вас есть в текущем представлении, если вы делаете @ Html.Partial (...). Вы можете сгенерировать частичный вид с помощью вызова AJAX, но в этом случае я думаю, что лучше сделать вызов AJAX и получить только URL-адрес изображения. –

ответ

4

Использование @Html.Partial() не вызывает метод контроллера и просто отображает html, определенный в частичном. По умолчанию он передает модель из основного представления в частичное (если вы не укажете его во втором параметре), поэтому, если модель в основном представлении не является типом TicketPaymentsAzureMVC.Models.Client, ваш код выдает исключение.

Если вы используете модель представления, которая содержит свойство Client Client (и вы заполнить эту собственность в методе GET), то вы можете использовать

@Html.Partial("_Header", Model.Client) 

передать экземпляр Client к частичной. Это означает, что для каждого представления, использующего этот макет, потребуется это свойство.

Лучшим вариантом является использование @Html.Action() или @{ Html.RenderAction(); } вызвать метод сервера, который возвращает частичное

[ChildActionOnly] 
public ActionResult Header() 
{ 
    Client model = ... // initialize your model and set the `BannerUrl` property 
    return PartialView(_"Header", model); 
} 

и в макете

@{ Html.RenderAction("Header", yourControllerName); } 
0

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

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

2) Используйте ViewBag. Ссылка: https://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbase.viewbag(v=vs.118).aspx

3) Используйте RenderAction (макет не зависит от действий, которые выполняются). Ссылка: https://msdn.microsoft.com/en-us/library/ee839451(v=vs.98).aspx

4) Выполнение вызова AJAX из JS-файла, на который ссылаются в макете (макет не зависит от выполняемых действий). Ссылка: http://www.aspsnippets.com/Articles/ASPNet-MVC-jQuery-AJAX-and-JSON-Example.aspx

Как вы это делаете, вам нужно определить базовый класс для модели с свойством BannerUrl. Вы можете использовать ViewBag, чтобы этого избежать, но мне тоже не нравится это решение.

Я хотел бы сделать это:

1) Создайте файл JS под названием layout.js. Этот файл сделает вызов AJAX для получения URL-адреса баннера и его установки.

2) В макете укажите файл JS, созданный в (1).

3) Любая страница, использующая макет, ничего не должна делать. Макет обрабатывает его сам по себе, поэтому никакой зависимости.