代码之家  ›  专栏  ›  技术社区  ›  John_

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

  •  1
  • John_  · 技术社区  · 16 年前

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

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

    public ActionResult Index(FirstLevelSubController firstLevel)
    

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

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

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

    我会被传回去什么,为什么?(我知道我可以做一个快速的测试,看看他们是否回来了,但这会让我不知道为什么。

    谢谢

    2 回复  |  直到 16 年前
        1
  •  4
  •   Brad Wilson    16 年前

    首先,获取传递给具有[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值是从路由值而不是表单集合中设置的。

        2
  •  2
  •   maxnk    16 年前

    通常,它是ControllerActionInvoker的一个函数。对象在自定义ControllerActionInvoker实现中实例化后传递到动作中。有关ControllerActionInvoker工作原理的更多信息,请查看 ASP.NET MVC - ControllerActionInvoker: Part 1

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