C# 你能给我解释一下MVCs控制器方法的动作参数吗?

C# 你能给我解释一下MVCs控制器方法的动作参数吗?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,有人能解释或链接一篇文章,解释如何填充传递到控制器操作中的参数吗?我理解当您拥有控制器/Action/ID并且ID作为变量传入时的基本映射,如果它没有转换为您请求的类型,那么它将不会传入该操作 但是,我一直在查看MVCContrib子控制器代码,有以下示例: public ActionResult Index(FirstLevelSubController firstLevel) 我想知道这个参数是如何填充的,因为据我所知,没有传递任何东西来填充这个参数 假设我创建了以下操作,这是控制器中唯一

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

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

public ActionResult Index(FirstLevelSubController firstLevel)
我想知道这个参数是如何填充的,因为据我所知,没有传递任何东西来填充这个参数

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

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index(Task task, ToDoList list)
我会被传回什么?为什么?我知道我可以做一个快速测试,看看他们是否回来了,但这会让我不知道为什么


谢谢一般来说,这是ControllerActionInvoker的一个功能。对象在自定义ControllerActionInvoker实现中实例化后传递到动作。有关ControllerActionInvoker如何工作的更多信息,请查看

还有一个称为模型绑定的功能,它可以帮助您将请求参数绑定到对象,因此在大多数情况下,您不需要自行实现ControllerActionInvoker。看看这个:
通常,它是ControllerActionInvoker的一个函数。对象在自定义ControllerActionInvoker实现中实例化后传递到动作。有关ControllerActionInvoker如何工作的更多信息,请查看

还有一个称为模型绑定的功能,它可以帮助您将请求参数绑定到对象,因此在大多数情况下,您不需要自行实现ControllerActionInvoker。看看这个:

首先,通过查询参数可以获得传递给具有[AcceptVerbsHttpVerbs.get]属性的方法的参数。例如:

http://localhost/Task/Index/?task=mytask&todolist=a,b,c,d
您看到的许多带有复杂参数的操作方法都是通过post调用的,最有可能是[AcceptVerbsHttpVerbs.post]的候选方法

创建以下示例方法:

public ActionResult Index(int id, FormCollection form)
{

}
如果要查看表单集合的位置,则在发布表单后可能会出现以下情况:

form["name"] = "bob"
form["city"] = "LA"
form["state"] = "CA"
form["zip"] = "90210"
在本例中,asp.net mvc只是解析表单值,并将它们抛出到表单集合对象中。当然,现在必须手动提取每个参数才能访问这些值。如果asp.NETMVC能够为您处理这个过程,那不是很好吗?如果您有以下课程:

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值是从路由值而不是表单集合中设置的。

首先,将参数传递给具有[AcceptVerbsHttpVerbs.get]属性的方法的唯一方法是通过查询参数。例如:

http://localhost/Task/Index/?task=mytask&todolist=a,b,c,d
您看到的许多带有复杂参数的操作方法都是通过post调用的,最有可能是[AcceptVerbsHttpVerbs.post]的候选方法

创建以下示例方法:

public ActionResult Index(int id, FormCollection form)
{

}
如果要查看表单集合的位置,则在发布表单后可能会出现以下情况:

form["name"] = "bob"
form["city"] = "LA"
form["state"] = "CA"
form["zip"] = "90210"
在本例中,asp.net mvc只是解析表单值,并将它们抛出到表单集合对象中。当然,现在必须手动提取每个参数才能访问这些值。如果asp.NETMVC能够为您处理这个过程,那不是很好吗?如果您有以下课程:

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值是从路由值而不是表单集合中设置的