我尝试使用调试器,但似乎无法到达任何地方。我无法进入Html.RenderAction(),它在我的母版页中。
我读到它通过路由“自动”获取值。这是如何运作的?
// "Nav" is the name of the controller housing the "Menu" action
// This is called in Site.Master
<% Html.RenderAction("Menu", "Nav"); %>
// where does "category" come from?
public ViewResult Menu(string category)
{
}
我按照一本书做了这个,但我在那里找不到解释。该类别应该自动从URL到参数。
在相关的说明中:您是否建议下载MVC的源代码以使其正常工作,或者这会使我的工作变得更加复杂?
答案 0 :(得分:1)
Html.RenderAction
调用在控制器"Menu"
中使用方法名称"Nav"
呈现操作。
路由文件包含有关如何填充方法参数(以及解决重载操作)的模式。路由文件通常位于~/Global.asax
方法的RegisterRoutes
中。此文件应包含对RouteCollection#MapRoute
的多次调用,该调用将某个URL模式映射到具有特定变量的新对象。
您的路由必须包含一个单独的字符串映射,它可以捕获任何没有斜杠的内容到名为category
的变量中。然后将其传递给Menu
操作方法。
附录:尝试查看here以获取更多信息。
答案 1 :(得分:1)
正在从以下路由条目中选择Category参数
routes.MapRoute(null, "{category}", // Matches ~/Football or ~/AnythingWithNoSlash
new { controller = "Products", action = "List", page = 1 }
);
所以如果输入/ Football,那么它将作为参数提供给
中的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"); %>
它可以选择路线中的类别参数,即{category}
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);
}
}