Можете ли вы объяснить мне параметры действий для методов контроллера MVC? - PullRequest
1 голос
/ 14 декабря 2008

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

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

public ActionResult Index(FirstLevelSubController firstLevel)

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

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

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

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 14 декабря 2008

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

2 голосов
/ 14 декабря 2008

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

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

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