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一起使用,所以我不知道是否有可能做我正在尝试的事情.
欢呼任何帮助.
这是 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/Product和Controllers/Shared)。当您位于正确的区域时,它能够找到它,因为它适合默认搜索位置,但在其他区域时则无法找到它,因为控制器仅位于一个物理区域中。
像您一样添加区域,告诉它在预定义的区域中搜索,这样它就会直接进入那里。
"Areas/Storemanagement/Views/product/"并搜索添加操作中定义的视图。
让空的辅助方法返回 Url.Action 方法没有什么意义,但这也许只是为了演示。
(我刚刚注意到这个问题很老了,但我想这可以放在这里以供将来参考)