Где разместить меню навигации, если не на главной странице - asp mvc - PullRequest
0 голосов
/ 15 января 2012

У меня есть один макет бритвы, этот макет распространяется на все мои виды.До сегодняшнего дня навигационное меню было (отдельный контроллер) в этой раскладке.Но теперь в этом меню есть динамические данные.И я больше не могу держать это на странице макета.Так следует ли отображать это меню навигации в каждом представлении, или есть какой-то другой способ сделать его только один раз и просто передать ему данные?

Вот как я отображаю меню навигации в макете бритвы:

@Html.Action("CommonMenu", "Navigation", new { area = "CityPage" })

В представлении CommonMenu у меня есть домашняя ссылка:

<li> @Html.ActionLink("Home", "Index", "Home", new { area = "CityPage", city = ViewBag.City, countryCode = ViewBag.CountryCode }, null)

И я открываю одну страницу с этим меню.Когда я нажимаю «Домой», я ожидаю, что пойду домой к городскому дому (например, в Великобританию, Лондон).

Но я могу перейти с этой страницы в другой город (например, ЦЗ, Цюрих).И теперь мне нужно перепривязать все меню навигации.И я не знаю, смогу ли я это сделать, если отобразить меню в макете бритвы? Обновление Вот как я перехожу с одной страницы города на другую:

@Html.ActionLink("Go To London", "Index", "Home", new { area = "CityPage", city = "London", countryCode = "UK" }, null)

Когда я нажимаю на эту ссылку, вызывается действие 'CommonMenu':

[ChildActionOnly]
        public PartialViewResult CommonMenu(string countryCode, string city)
        {...

Но по какой-то причине это действиевызывается несколько раз:В первый раз оба значения равны нулю.Во второй раз значения Великобритания, Лондон.Третий раз - ноль.И это может привести к разрыву моей страницы.

Ответы [ 2 ]

1 голос
/ 15 января 2012

Вы находитесь на правильном пути, используя дочернее действие для навигации по макету. Однако, вместо использования viewbag, почему бы не набрать его строго?

ViewModel:

public class CommonMenuLinkModel
{
    public string Text { get; set; }
    public string Area { get; set; }
    public string Controller { get; set; }
    public string Action { get; set; }
    public string City { get; set; }
    public string CountryCode { get; set; }
}

Вид:

@model IEnumerable<CommonMenuLinkModel>
<ul>
@foreach(var link in Model)
{
    <li>@Html.ActionLink(link.Text, link.Controller, link.Action, 
        new {area = link.Area, city = link.City, countryCode = link.CountryCode}, 
        null)</li>
}
</ul>

В вашем контроллере вместо того, чтобы помещать вещи в ViewBag, поместите их в строго типизированную коллекцию CommonMenuLinkModels и передайте это частичному представлению.

Примечание. Вы можете оставить это как дочернее действие, вызываемое из вашего макета.

Обновление

Я хотел бы повторить то, что я сказал в на один из ваших вопросов, на которые я ранее ответил . Используя T4MVC, вы можете сгенерировать ссылки для действий следующим образом:

<li>@Html.ActionLink(link.Text, 
    MVC.CityPage.Home.Index(link.CountryCode, link.City))</li>

Или даже лучше, вот так, чтобы вы могли более четко контролировать HTML:

<a href="@Url.Action(MVC.CityPage.Home.Index(link.CountryCode, link.City))">
    @link.Text</a>
0 голосов
/ 15 января 2012

Вы можете использовать RenderAction в вашем макете. Он будет вызывать действие из контроллера и отображать его динамически, как вам нужно:

@{ Html.RenderAction("Index", "NavigationMenu"); }

В этом случае будет отображаться результат действия «Индекс» контроллера «NavigationMenu»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...