Параметр категория подхватили из следующей маршрутной записи
routes.MapRoute(null, "{category}", // Matches ~/Football or ~/AnythingWithNoSlash
new { controller = "Products", action = "List", page = 1 }
);
так, если/Футбол вводится затем подается в качестве параметра меню ViewResult в
, который, в свою очередь вызовов
public ViewResult List(string category, int page = 1)
{
var productsToShow = (category == null)
? productsRepository.Products
: productsRepository.Products.Where(x => x.Category == category);
var viewModel = new ProductsListViewModel {
Products = productsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
PagingInfo = new PagingInfo {
CurrentPage = page,
ItemsPerPage = PageSize,
TotalItems = productsToShow.Count()
},
CurrentCategory = category
};
return View(viewModel); // Passed to view as ViewData.Model (or simply Model)
}
чуть позже в мастере вида при визуализации действия называется
<% Html.RenderAction("Menu", "Nav"); %>
он может подобрать по параметру категории в маршруте т.е. {} категориях
public ViewResult Menu(string category)
{
// Just so we don't have to write this code twice
Func<string, NavLink> makeLink = categoryName => new NavLink
{
Text = categoryName ?? "Home",
RouteValues = new RouteValueDictionary(new {
controller = "Products", action = "List",
category = categoryName, page = 1
}),
IsSelected = (categoryName == category)
};
// Put a Home link at the top
List<NavLink> navLinks = new List<NavLink>();
navLinks.Add(makeLink(null));
// Add a link for each distinct category
var categories = productsRepository.Products.Select(x => x.Category);
foreach (string categoryName in categories.Distinct().OrderBy(x => x))
navLinks.Add(makeLink(categoryName));
return View(navLinks);
}
}
@Nicholas: Еще один вопрос: я понимаю, почему Product.List() вызывается с правильным параметром. Теперь я понимаю, почему вызывает вызов NavController.Menu(). Но почему вызывает вызов NavController.Menu() с правильным параметром {category}?Запись маршрутизации указала «ProductsController» и «List» как действие по умолчанию, которое будет использоваться. Нигде не упоминается о NavController и действии «Меню» в моих инструкциях по маршрутизации. (ссылаясь на вашу первую цитату исходного кода. Там нет «Nav» или «Menu», но категория по-прежнему передается. – Blub
@Blub - она вызывается с параметром, поскольку параметр доступен через url - так же, как если бы это была index.asp? category = chess, и у вас был метод, который вызывал Request.QueryString («category»). Если в маршрутизации вы изменили маршруты. MapRoute (null, «{category}», на маршруты .MapRoute (null, "{catgory}", то при прохождении кода вы увидите, что категория равна нулю. –
@Nicholas: Итак, Request.QueryString() всегда получает вызов * автоматически *, то, правильно? MVC. Каким бы ни было действие, которое я когда-либо мог написать, он будет вызван, чтобы получить параметры url? – Blub