2011-01-10 2 views
0

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

ответ

1

Параметр категория подхватили из следующей маршрутной записи

 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); 
    } 
} 
+0

@Nicholas: Еще один вопрос: я понимаю, почему Product.List() вызывается с правильным параметром. Теперь я понимаю, почему вызывает вызов NavController.Menu(). Но почему вызывает вызов NavController.Menu() с правильным параметром {category}?Запись маршрутизации указала «ProductsController» и «List» как действие по умолчанию, которое будет использоваться. Нигде не упоминается о NavController и действии «Меню» в моих инструкциях по маршрутизации. (ссылаясь на вашу первую цитату исходного кода. Там нет «Nav» или «Menu», но категория по-прежнему передается. – Blub

+0

@Blub - она ​​вызывается с параметром, поскольку параметр доступен через url - так же, как если бы это была index.asp? category = chess, и у вас был метод, который вызывал Request.QueryString («category»). Если в маршрутизации вы изменили маршруты. MapRoute (null, «{category}», на маршруты .MapRoute (null, "{catgory}", то при прохождении кода вы увидите, что категория равна нулю. –

+0

@Nicholas: Итак, Request.QueryString() всегда получает вызов * автоматически *, то, правильно? MVC. Каким бы ни было действие, которое я когда-либо мог написать, он будет вызван, чтобы получить параметры url? – Blub

1

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

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

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

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

+0

Что касается «автоматически посредством маршрутизации» бизнес, который ссылается на только входящую URL. Если на главной странице вызывается 'Html.RenderAction', это не входящий URL-запрос. Поэтому для целей «Html.RenderAction» вы можете забыть о маршрутизации. –

+0

Что такое входящий URL? И документы говорят, что второй строковый параметр Html.RenderAction() - это имя контроллера. В моем решении я никогда не получаю «Nav» в моей переменной категории, а в последней части моего URL. (например: www.example.com/trees -> приводит к «деревьям» в параметре категории) Я до сих пор не понимаю, почему. – Blub

+0

@Blub: Ах, черт возьми, я был совершенно не прав в своем первоначальном ответе. Сожалею! Я отредактировал его в надежде, что это будет иметь больше смысла. –

Смежные вопросы