繁体   English   中英

Html.RenderAction调用的操作的参数从何而来?

[英]Where do the parameters come from for action that gets invoked by Html.RenderAction?

我尝试使用调试器,但似乎无处可去。 我无法进入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的源代码以使其正常工作,还是会使我的工作变得比其有用的多?

Html.RenderAction调用在控制器"Nav"呈现方法名称为"Menu"的动作。

路由文件包含有关如何填充方法参数(和解决重载操作)的模式。 通常在~/Global.asax中的RegisterRoutes方法中找到路由文件。 该文件应包含对RouteCollection#MapRoute多次调用,该调用将某个URL模式映射到具有特定变量的新对象。

您的路线必须在某个位置包含一个字符串映射,该字符串映射可以将任何不带斜线的内容捕获到名为category的变量category 然后将其传递给Menu操作方法。

附录:尝试在此处查找更多信息。

从以下路由条目中选择了类别参数

        routes.MapRoute(null, "{category}", // Matches ~/Football or ~/AnythingWithNoSlash
                        new { controller = "Products", action = "List", page = 1 }
        );

因此,如果输入/ Football,则会将其作为参数提供给

依次调用

    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)
    }

所以稍后在视图母版中调用render动作时

    <% 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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM