ASP.NET MVC 3:如何获取调用action方法的参数?

时间:2011-11-09 03:24:16

标签: asp.net-mvc-3

如何获取对象参数,在运行时调用哪个操作方法,以实现以下效果:

public ActionResult Index(Int32? x, Int32? y, DateTime? z, NumberStyles n) {
this.RouteData.Values["x"] = x
this.RouteData.Values["y"] = y
this.RouteData.Values["z"] = z
this.RouteData.Values["n"] = n
return View();
}

在没有这种繁琐代码的情况下,似乎应该对每个参数的名称和值都有可能。

有时你可以通过查看RouteData来获取调用action方法的参数,但情况并非总是如此,特别是如果使用ajax请求调用action方法,参数可能不会显示在RouteData,而是显示在请求参数中。

我正在寻找的是获取在运行时在操作方法签名中定义的每个参数的通用方法,并获取参数的实际对象,运行时值,而不仅仅是字符串。此外,无论是如何调用操作方法,它都应该工作,它可能是ChildActionExtensions.Action的结果还是ajax回调的结果。

RouteData和Request Params似乎没有我想要的东西。

1 个答案:

答案 0 :(得分:1)

您的代码示例将值设置回RouteData集合。您是否尝试使用RouteData集合将参数传递给视图?这不是它的存在,你可以考虑使用ViewBag。

或者,创建一个包含所有属性的POCO,让数据绑定器完成所有工作(因此在视图中使用@model YourType并将一个参数传递给视图。默认模型绑定器将映射个人你的参数值。)。

就输入值集合而言,有充分的理由说明为什么在您提到的集合中不能始终如一地找到该值。

这里的诀窍可能是澄清你的行动被调用之前发生了什么。您的操作方法的参数可以来自多个源。例如,它可能来自:

  1. 网址路径
  2. URL查询字符串(例如:在GET中,问号后面的参数?)
  3. 张贴表单数据
  4. 来自其他行动的明确论据
  5. 在上面的代码示例中,如果您的路由具有匹配的参数名称,则RouteData集合将仅包含值“x”。

    例如:“{controller}/{action}/{x}”。 (这是从路径中拉出“x”的自定义路线)

    如果失败,将使用默认模型绑定器解析这些值,并根据具体情况从查询字符串参数或POST数据中提取。

    路线值优先。因此,如果应用了上述自定义路由,则会显示以下URL:

    http://www.example.com/Something/Index/1?x=2
    

    会使用x = 1 调用您的操作。然后在RouteData中找到1从URL路径中拉出,并且在Request.QueryString中找到的x = 2将被忽略。

    如果你担心x如何获得它的价值,那么你必须考虑上述所有因素,这样你才能知道在哪里看。还有一个问题是哪条路线适用于请求,但这是另一个主题。

    所有输入都以文本的形式出现在线上..它是模型绑定器,它检查了您的操作签名并转换为您指定的类型(只要有可能)。

    所以,在这种情况下,我不认为你所要求的是概念性的。