你能解释一下MVC Controller方法的Action参数吗?

时间:2008-12-14 10:27:44

标签: c# asp.net asp.net-mvc

有人可以解释或链接到一篇解释如何填充传递给控制器​​操作的参数的文章吗?当你拥有Controller / Action / ID并且ID作为变量传入时,我理解基本映射,如果它没有转换为你要求的类型,那么它将不会被传递给该动作。

但是我一直在查看MVCContrib子控制器代码,并且有以下示例:

public ActionResult Index(FirstLevelSubController firstLevel)

我想知道这个参数是如何填充的,因为据我所知,没有传递任何内容来填充它?

假设我创建了以下操作,这是控制器中唯一的操作:

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

我会传回什么,为什么? (我知道我可以做一个快速测试,看看他们是否确实回来了,但这会让我更加明智。

由于

2 个答案:

答案 0 :(得分:4)

首先,使用[AcceptVerbs(HttpVerbs.Get)]属性传递参数的唯一方法是通过查询参数。例如:

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

您在复杂参数中看到的许多动作方法都是通过post调用的,并且最像是[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将在调用action方法之前使用反射来弹出用户参数。实际上它正在执行以下操作,对于表单集合中的每个键,它使用反射来定位该属性,以及在操作方法中声明的参数列表。如果找到与之匹配的属性,则会尝试设置它的值。

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

但是,id值是从路由值设置的,而不是表单集合。

答案 1 :(得分:2)

通常,它是ControllerActionInvoker的一个功能。在自定义ControllerActionInvoker实现中实例化对象后,对象将进入操作。有关ControllerActionInvoker如何工作的更多信息,请查看ASP.NET MVC - ControllerActionInvoker: Part 1

还有一个名为“模型绑定”的功能,它可以帮助您将请求参数绑定到对象,因此在大多数情况下,您不需要自己创建ControllerActionInvoker。看看这个: ASP.NET MVC model binding from ScottGu