Значения параметров конструктора по умолчанию в ASP.Net MVC? - PullRequest
1 голос
/ 22 декабря 2011

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

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

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

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

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

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

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

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

В вашем классе Cart теперь для свойства Size установлено значение 5.

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

1 голос
/ 22 декабря 2011

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

  • Параметры маршрута
  • Строка запроса
  • Переменные формы
  • И т. Д.
...