Можете ли вы объяснить мне параметры действий для методов контроллера MVC?

Может кто-нибудь объяснить или дать ссылку на статью, которая объясняет, как заполняются параметры, переданные в действие контроллера? Я понимаю базовое отображение, когда у вас есть Controller / Action / ID и ID передается как переменная, если он не преобразуется в тип, который вы запрашиваете, он не будет передан в это действие.

Однако я смотрел на код подконтроллера MVCContrib, и был следующий пример:

public ActionResult Index(FirstLevelSubController firstLevel)

Я хочу знать, как заполняется этот параметр, потому что, насколько я знаю, ничего не передается для заполнения этого?

Допустим, я создал следующее действие, которое является единственным действием в контроллере:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index(Task task, ToDoList list)

Что бы мне передали обратно и почему? (Я знаю, что мог бы сделать быстрый тест, чтобы узнать, вернулись ли они, но это сделало бы меня не знающим, почему.

Спасибо

14.12.2008 10:27:43
2 ОТВЕТА
РЕШЕНИЕ

Как правило, это функция ControllerActionInvoker. Объекты передаются в действие после того, как они были созданы в пользовательской реализации ControllerActionInvoker. Для получения дополнительной информации о том, как ControllerActionInvoker работает, взгляните на ASP.NET MVC - ControllerActionInvoker: Часть 1

Также есть функция под названием «привязка модели», которая помогает вам связать параметры запроса с вашими объектами, поэтому в большинстве случаев вам не нужно создавать собственную реализацию ControllerActionInvoker. Взгляните на это: привязка модели ASP.NET MVC от ScottGu

2
14.12.2008 10:46:38

Прежде всего, единственный способ получить параметры, передаваемые методу с атрибутом [AcceptVerbs (HttpVerbs.Get)], - через параметры запроса. Пример:

http://localhost/Task/Index/?task=mytask&todolist=a,b,c,d

Многие из методов действия, которые вы видите со сложными параметрами, вызываются по почте и, скорее всего, будут кандидатом на [AcceptVerbs (HttpVerbs.Post)].

Создайте следующий пример метода:

public ActionResult Index(int id, FormCollection form)
{

}

Если вы проверяете коллекцию форм, у вас может быть что-то вроде следующего после публикации формы:

form["name"] = "bob"
form["city"] = "LA"
form["state"] = "CA"
form["zip"] = "90210"

в этом случае asp.net mvc просто проанализировал значения формы и бросил их в объект коллекции форм. Конечно, теперь вы должны извлечь каждый параметр вручную, чтобы получить доступ к значениям. Разве не было бы неплохо, если бы asp.net mvc справился с этим процессом за вас? Если у вас был следующий класс:

public class User
{
    string string Name {get; set;}
    string string City {get; set;}
    string string State {get; set;}
    string string Zip {get; set;}
}

и добавил, что к вашему методу действий

public ActionResult Index(int id, User user)

asp.net mvc будет использовать отражение для всплывающего пользовательского параметра перед вызовом вашего метода действия. По сути, он делает следующее: для каждого ключа в коллекции форм он использует отражение, чтобы найти это свойство в списке параметров, объявленных в вашем методе действия. Если он находит свойство, которое соответствует, он попытается установить его значение.

user.Name = form["name"]
user.City = form["city"]
user.State = form["state"]
user.Zip = int.Parse(form["zip"])

Однако значение id устанавливается из значений маршрутизации, а не из коллекции форм.

4
15.12.2008 15:00:17