C# 如果控制器';s行动不';你没有匹配的参数吗?
如果我的一个视图中包含以下代码:C# 如果控制器';s行动不';你没有匹配的参数吗?,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc Routing,如果我的一个视图中包含以下代码: @Html.Action("Grid", "Product", new { section = SectionType.Product }) 这将调用myProductController的Grid操作方法,这一切都很好。如果网格方法定义如下: public ActionResult Grid(SectionType section) { ... } public ActionResult Grid() { ... } // nullable Sectio
@Html.Action("Grid", "Product", new { section = SectionType.Product })
这将调用myProductController
的Grid
操作方法,这一切都很好。如果网格方法定义如下:
public ActionResult Grid(SectionType section) { ... }
public ActionResult Grid() { ... }
// nullable SectionType
public ActionResult Grid(SectionType? section) { ... }
然后,section
参数将按照我的要求,用SectionType.Product
填充。但是,如果我不将参数放入方法声明中,如下所示:
public ActionResult Grid(SectionType section) { ... }
public ActionResult Grid() { ... }
// nullable SectionType
public ActionResult Grid(SectionType? section) { ... }
然后,视图中设置的部分
值似乎完全消失了。它不在Request.Params
中,也不在Request.QueryString
中,事实上我似乎在任何地方都找不到它
谁能告诉我这个值发生了什么变化?我可以从任何地方检索它吗,或者如果该方法没有在参数列表中请求它,MVC是否会完全丢弃它?我猜
SectionType
是一个枚举。
如果是,则如果在操作中未找到匹配参数,则会发生错误
// throw exception if you don't pass section value
public ActionResult Grid(SectionType section) { ... }
参数字典包含参数的空条目
不可为空类型的“节”
方法的“MVCAPApplication1.Controllers.SectionType”
'System.Web.Mvc.ActionResult
索引(MVCAPApplication1.Controller.SectionType)'
“MVCAPApplication1.Controllers.HomeController”。可选参数
必须是引用类型、可为null的类型或声明为
可选参数。参数名称:参数
从上面的消息中,如果在操作中找不到匹配的参数,并且参数是不可为空的
类型,则会发生异常
如果您这样更改操作:
public ActionResult Grid(SectionType section) { ... }
public ActionResult Grid() { ... }
// nullable SectionType
public ActionResult Grid(SectionType? section) { ... }
或
// default value
public ActionResult Grid(SectionType section = SectionType.Area) { ... }
当section
为null
类型时,将使用section
值为null调用该操作。
当
section
具有默认值时,将使用section
值为null调用操作,但在操作中它将使用默认值。您可以通过RequestContext
中路由数据的集合访问从路由提取的任何参数:
var section = Request.RequestContext.RouteData.Values["section"];
我不确定它是否属于所需的枚举类型(即,节类型
)装入对象
,或者只是一个字符串
(也装入对象
),您需要自己适当地强制转换为枚举类型
如果没有具有可获取区段
参数值的区段的路由,则应将其存储在请求.QueryString
中,并应可通过请求.QueryString[“区段”]
进行访问。同样,在这种情况下,生成的html应该看起来像..?section=SomeSection
,而在这种情况下,如果您有合适的路由,它必须看起来像../SomeSection
,我看不到任何方法来获得它。我将等待更了解的人,但我猜测,由于您没有实际执行get/post,因此在没有任何绑定的情况下,该值会在某个地方丢失。请注意,如果对@Html.ActionLink()执行相同的操作,则可以在请求中获取它。QueryString@MikeC. 是的,我知道ActionLink,但我不想让用户按任何键——我需要页面自己调用这个控制器方法。我觉得非常奇怪,MVC至少没有在请求中加入这个值。Params…哦,我认为这是学术性的。只需传递参数,正如您已经演示的那样。@MikeC,为什么你甚至对在不接受控制器方法中的值的情况下传递感兴趣。我们需要它是为了一个特定的目的。但是我不明白你刚才传递参数是什么意思,正如我已经展示的那样。以这种方式传递参数而不将参数放入方法的声明中会导致参数完全消失。但是如果你说你有一个很好的理由,那么我相信你。祝你好运。我想你的问题是颠倒过来的:)。。我不关心调用没有参数的方法。我关心的是使用参数调用该方法,而该方法的声明中没有该参数。本质上,我告诉MVC“我正在调用一个名为Grid的方法,我正在传递这个‘section’值。method Grid不是一个‘section’参数,但我仍然希望您将它存储在某个地方。”这有意义吗?不,这似乎不起作用。Request.RequestContext.RouteData.Values[“section”]标记为null。@Amberite它也取决于路由,它匹配。可能路由没有名为section
…的段。在调试模式下,您能否检查键和值请求了什么。RequestContext.RouteData.Values
是否包含?@Amberite,如果它不在RouteData
和中(如您在问题中所说)它不在请求.QueryString
中,那么您应该检查生成的html。它是否包含此部分
?它是?section=someSection
还是../someSection
。。。