有人可以解释或链接到一篇解释如何填充传递给控制器操作的参数的文章吗?当你拥有Controller / Action / ID并且ID作为变量传入时,我理解基本映射,如果它没有转换为你要求的类型,那么它将不会被传递给该动作。
但是我一直在查看MVCContrib子控制器代码,并且有以下示例:
public ActionResult Index(FirstLevelSubController firstLevel)
我想知道这个参数是如何填充的,因为据我所知,没有传递任何内容来填充它?
假设我创建了以下操作,这是控制器中唯一的操作:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index(Task task, ToDoList list)
我会传回什么,为什么? (我知道我可以做一个快速测试,看看他们是否确实回来了,但这会让我更加明智。
由于
答案 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