2011-11-09 60 views
1

你如何获得的对象参数,其操作方法是在运行时调用,成就一番以下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方法的参数,但情况并非总是如此,特别是如果action方法是通过ajax请求调用的,那么参数可能不会显示出来在RouteData中,而是显示在Request Params中。

我在找什么,是一种通用的方式来获取运行时在动作方法签名中定义的每个参数,并获取参数的实际对象,运行时值,而不仅仅是一个字符串。更进一步说,不论操作方法如何被调用,它都可以工作,不管它可能是ChildActionExtensions.Action或ajax回调的结果。

RouteData和Request Params似乎没有我正在寻找的东西。

+0

这让我感兴趣,但是,我也在等别人说你做错了。如果可能,我会对更多的代码感兴趣。 –

+0

@Valamas也是如此。现在在框架的第三个版本中,这个问题还没有被问到,这有点令人惊讶。如果有人不能真正回答这个问题,那么他们的答案会变成“为什么你需要...”? –

回答

1

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

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

就输入值集合而言,为什么在您提到的集合中不能一致地找到该值,这有一个很好的理由。

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

  1. URL路径
  2. URL查询字符串(例如:在一个GET,问号后的参数?)
  3. 提交的表单数据
  4. 明确论点从另一个动作

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

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

如果不成功,将使用默认模型联编程序解析这些值,并根据具体情况从查询字符串参数或POST数据中提取值。

路由值将优先。因此,如果在应用上面的自定义路由,以下网址:

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

将调用其中x = 1 行动。然后,将从URL路径中找到RouteData中找到的1,并忽略在Request.QueryString中找到的x = 2。

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

所有输入都以文本的形式出现。它是模型活页夹,用于检查您的动作签名并转换为您指定的类型(无论哪里都可以)。

所以,我不认为你在这个环境中在概念上存在你所要求的。