Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果控制器';s行动不';你没有匹配的参数吗?_C#_Asp.net_.net_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

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 })
这将调用my
ProductController
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
。。。