Откуда берутся параметры для действия, которое вызывается Html.RenderAction? - PullRequest
0 голосов
/ 10 января 2011

Я пытался использовать отладчик, но, похоже, никуда не денусь.Я не могу войти в 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 для правильной работы или это усложнит мои усилия больше, чем поможет?1008 *

Ответы [ 2 ]

1 голос
/ 11 января 2011

Параметр 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"); %>

, он может получить параметр категории в маршруте, т.е.*

    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);
    }
}
1 голос
/ 10 января 2011

Вызов Html.RenderAction отображает действие с именем метода "Menu" в контроллере "Nav".

Файл маршрутизации содержит шаблоны для заполнения параметров метода (и разрешения перегруженных действий).Файл маршрутизации обычно находится в ~/Global.asax, в методе RegisterRoutes.Этот файл должен содержать несколько вызовов RouteCollection#MapRoute, который отображает определенный шаблон URL на новый объект с определенными переменными.

Ваши маршруты должны включать где-то одно сопоставление строк, которое захватывает что-либо без косой черты в переменнойназывается category.Затем он передается методу действия Menu.

Приложение: Попробуйте поискать здесь для получения дополнительной информации.

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