UrlHelper.Action不会映射到控制器正确的区域

Jam*_*xon 8 c# asp.net asp.net-mvc-routing asp.net-mvc-2

更新2

好的 - 所以看起来我的问题再次稍微改变:-)

我现在意识到UrlHelper.Action似乎没有正确解析任何区域中的URL,除非明确指定了区域名称.如果没有指定它似乎返回我们当前所在的任何区域名称,这使得它看起来像是从站点的一个部分起作用,但是然后另一个区域中的相同链接解析为错误的区域名称.

要么我做了一些时髦的事情要么做到这一点,要么我不太了解这个Action方法是如何工作的.

更新1

我可以通过以下方式完成这项工作:

return helper.Action("add", "product",new {area = "storemanagement"});
Run Code Online (Sandbox Code Playgroud)

这稍微改变了我的问题.

为什么MVC路由不会消除具有相同名称的控制器的歧义并解析为指定了action方法的控制器?

原创帖子

嘿大家,

我在UrlHelper类上创建了一个辅助方法,并且其中一个路由遇到了一个小问题.

这是有问题的辅助方法的代码:

public static string AddProduct(this UrlHelper helper)
        {
            return helper.Action("add", "product");
        }
Run Code Online (Sandbox Code Playgroud)

我基本上有两个名为"product"的控制器,它们位于站点的不同区域.其中一个用于浏览产品,另一个用于产品管理.只有一个产品控制器包含一个操作方法"添加".

当我输出AddProduct的值

<%: Url.AddProduct() %>
Run Code Online (Sandbox Code Playgroud)

区域名称将解析为我正在浏览的当前区域,而不是包含Add操作方法的产品控制器的正确区域.

我需要在路线中设置一些东西吗?我不确定路由如何与UrlHelper.Action一起使用,所以我不知道是否有可能做我正在尝试的事情.

欢呼任何帮助.

lko*_*lko 1

这是 ASP.NET 路由的默认行为。

当在“区域”中时,将通过默认位置中的控制器和操作名称来搜索操作(和视图)。除非在操作中另有说明,否则视图被假定为 ActionName,例如return PartialView("_MyPartialView.cshtml", ViewModel)

默认位置如下:{Controller} = 控制器名称,{Area} = 区域名称

控制器:

"Areas/{Area}/{Controller}/"
"Controllers/{Controller}"
Run Code Online (Sandbox Code Playgroud)

浏览次数:

"Areas/{Area}/Views/{Controller}/" 
"Areas/{Area}/Views/Shared/"
"Views/Shared"
Run Code Online (Sandbox Code Playgroud)

如果您不在路线值中指定区域,它将永远不会在这些位置之外进行搜索。该区域与您呼叫助手的位置相同。如果您位于根级别(不在某个区域),它将被限制为

"Controllers/{Controller}" // controller
"Views/{Controller}/" // views
"Views/Shared" // views
Run Code Online (Sandbox Code Playgroud)

问题是,当您在一个 Area1 中时,它会搜索 "Areas/Area1/{Controller}/",而当您在 Area2 中时,它会搜索"Areas/Area2/{Controller}/"(并且都搜索Controllers/ProductControllers/Shared)。当您位于正确的区域时,它能够找到它,因为它适合默认搜索位置,但在其他区域时则无法找到它,因为控制器仅位于一个物理区域中。

像您一样添加区域,告诉它在预定义的区域中搜索,这样它就会直接进入那里。 "Areas/Storemanagement/Views/product/"并搜索添加操作中定义的视图。

让空的辅助方法返回 Url.Action 方法没有什么意义,但这也许只是为了演示。

(我刚刚注意到这个问题很老了,但我想这可以放在这里以供将来参考)