【问题标题】:ASP.NET MVC 3: how to get parameters the action method was called with?ASP.NET MVC 3:如何获取调用操作方法的参数?
【发布时间】:2011-11-09 03:24:16
【问题描述】:

如何获取对象参数,在运行时调用哪个动作方法,以完成以下效果

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 似乎没有我想要的。

【问题讨论】:

  • 这让我很感兴趣,但是,我也在等待别人说你做错了。如果可能的话,我会对更多代码感兴趣。
  • @Valamas 我也是。令人惊讶的是,现在在框架的第三版中,还没有提出这个问题。不足为奇的是,如果有人不能真正回答这个问题,那么他们的答案就会变成“你为什么需要......?”

标签: asp.net-mvc-3


【解决方案1】:

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

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

就输入值集合而言,在您提到的集合中无法始终找到该值是有充分理由的。

也许这里的技巧是在你的动作被调用之前澄清正在发生的事情。您的操作方法的参数可以来自多个来源。例如,它可能来自:

  1. 网址路径
  2. URL 查询字符串(例如:在 GET 中,问号后面的参数?)
  3. 已发布的表单数据
  4. 另一个动作的显式参数

在您上面的代码示例中,如果您的路由具有匹配的参数名称,RouteData 集合将只包含“x”的值。

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

否则,将使用默认模型绑定器解析值,并将视情况从查询字符串参数或 POST 数据中提取值。

路由值优先。所以如果应用了上面的自定义路由,下面的URL:

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

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

如果您关心 x 是如何获得它的值的,那么您必须考虑以上所有因素,这样您就知道在哪里寻找。还有一个问题是哪个路由应用于请求,但这完全是另一个话题。

所有输入都以文本形式通过网络传输。模型绑定器检查了您的操作签名并转换为您指定的类型(只要可能)。

因此,我认为您所要求的内容在这种情况下甚至在概念上都不存在。

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多