2011-12-21 3 views
1

Я использую MVC3 с синтаксисом Razor, и я перехожу к примеру в книге Apress «Pro ASP.Net MVC 3 Framework» (что очень хорошо). В ней автор имеет этот бит в файле _Layout.cshtml:Значения параметров конструктора по умолчанию в ASP.Net MVC?

<body> 
    <div id="header"> 
     @{Html.RenderAction("Summary", "Cart");} 
     <div class="title">SPORTS STORE</div> 
    </div> 
    <div id="categories"> 
     @{ Html.RenderAction("Menu", "Nav"); } 
    </div> 
    <div id="content"> 
     @RenderBody() 
    </div> 
</body> 

Мой вопрос связан с классом CartController. Я вижу, что он передал объект Cart в своем конструкторе, но код в приведенном выше фрагменте _Layout.cshtml не отображается, если он вызывается RenderAction()?

CartController фрагмент кода:

public ViewResult Summary(Cart cart) { 
    return View(cart); 
} 

Когда я отладить этот метод телеге объект является на самом деле прошло, но я не вижу, где он и откуда. Этот пример кода использует Ninject в качестве контейнера для инъекций зависимостей, но я не могу найти никаких доказательств в конфигурации, что он знает что-либо о классе Cart. Есть ли в MVC механизм «значение по умолчанию»?

ответ

4

Summary - действие метод. Это не конструктор. Поэтому DI не имеет к этому никакого отношения. Вместо этого мы видим поведение стандартного связующего. То есть, связующее устройство моделирует все параметры, которые вы заявляете для своего метода действий, и попытается заполнить эти аргументы данными, полученными из параметров формы или строки запроса и значений маршрута.

В вашем конкретном случае, поскольку вы не передаете какие-либо значения маршрута в ваш вызов Html.Action, все, что он делает, это экземпляр класса Cart - если вы его осмотрите, вы, вероятно, увидите, что он пуст (свойства не установлены).

Однако, если вы должны были передать значения маршрута в свой Action вызов, он заполнит этот объект. Например, если Cart содержит свойство под названием «Размер» типа Int, и ваш звонок действий выглядел так:

@Html.Action("Summary", "Cart", new { Size = 5 }) 

Ваш Cart класс будет теперь его свойство Size установлено в 5.

(Заметим также, что в этом случае гораздо чище использовать метод Action, а не метод RenderAction. Как вы видели, RenderAction предполагает вызов на уровне инструкций, который требует наличия уродливых закрывающих фигурных скобок. С другой стороны, Action - это выражение и возвращает фактический HTML-контент inline и, следовательно, может быть выражено более кратким образом.)

+0

Вы правы, Резюме() не конструктор - мои извинения. И спасибо за потрясающее объяснение поведения повязки модели по умолчанию. – larryq

+0

Боковое примечание: не является ли 'RenderAction' лучше, чем' Action', потому что он отображает непосредственно в выходной поток (вместо построения длинной строки)? Я думаю, это все еще довольно неважно ...микро-оптимизации. –

1

Summary - фактически метод действия, а не конструктор. Данные могут поступать из целого ряда различных мест: Параметры

  • Route
  • Строка запроса
  • переменные формы
  • т.д.