我尝试重写和自定义@Html.ActionLink,在此方法的一个重载中,参数是:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper,
string linkText, string actionName);
Run Code Online (Sandbox Code Playgroud)
我想要像上面这样的东西,还需要找到AreaName和ControllerName而不通过参数传递它,我想使用以下内容:
string controller = ViewContext.RouteData.Values["Controller"];
string area = ViewContext.RouteData.DataTokens["Area"];
Run Code Online (Sandbox Code Playgroud)
但错误上升为:
An object reference is required for the non-static field, method, or property
'System.Web.Mvc.ControllerContext.RouteData.get'
Run Code Online (Sandbox Code Playgroud)
显然我使用静态,那你在寻找区域名称和控制器名称的建议是什么HtmlHelpers?
更新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一起使用,所以我不知道是否有可能做我正在尝试的事情.
欢呼任何帮助.
我ViewContext.RouteData.Values["Controller"]用来获取控制器名称或ViewContext.RouteData.Values["action"]在视图中获取操作名称(实际上在_Layout中),但是对于区域来说这ViewContext.RouteData.Values["Area"]不起作用.您有什么建议在programmaticaly视图中获取区域名称?
我可以_Layout.cshtml 通过执行以下操作获取当前控制器名称和操作名称
var controller = ViewContext.RouteData.Values["controller"].ToString();
var action = ViewContext.RouteData.Values["action"].ToString();
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试获得该区域
var area = ViewContext.RouteData.Values["area"].ToString();
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为该对象中只存在2个键("控制器"和"动作")
我检查了ViewContext.RouteData对象,无法获取当前Area名称的值.
之前版本的先前答案ASP.net对我不起作用.
我正在编写一个 ActionFilter 并且需要从 ActionExecutingContext 参数中获取区域名称(我想实现基于快速和脏登录的安全性)。是否可以?
我有一个ASP.NET和MVC5的小问题(我开始使用MVC.NET).直到昨天,一切都很好!但今天,我不知道为什么,我有"自定义路线注释"的问题.
我有一个控制器"Prodouits"与此动作:
[Route("{culture}/Produits/{nom_groupe}/{nom}-{id}")]
public ActionResult Detail(string nom_groupe, string nom, string id)
{
// ...
return View();
}
Run Code Online (Sandbox Code Playgroud)
在我的观点中,当我调用"Url.Action(...)"时,URL很好.但是当我进入页面时,RouteData似乎很糟糕(RouteData未正确恢复).
看看我的RouteData:Keys [0] =>"MS_DirectRouteMatches"Keys [1] =>"controller"
Values[0] => //A list of only 1 RouteData with my 6 parameters into it...
Values[1] => Produits
Run Code Online (Sandbox Code Playgroud)
如果我删除我的"自定义路线通知",一切都很好,但URL非常难过...
有人对问题和解决方案有所了解吗?谢谢大家的帮助!
编辑:有关此问题的更多信息.我有一个语言的"BaseController".我重写了"BeginExecuteCore"方法.有代码:
protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
string cultureName = RouteData.Values["culture"] as string;
// Attempt to read the culture cookie from Request
if (cultureName == null)
cultureName = Request.UserLanguages != null && Request.UserLanguages.Length > 0 ? …Run Code Online (Sandbox Code Playgroud)