无法在类文件中使用Url.Action

3

在我的ASP.NET MVC3网站中,我在视图中使用Url.Action来生成URL。

@Url.Action("Profile", "Users", new { @Id = Model.UserId, name = Model.NickName })

现在,在我的一个帮助类中,我需要做同样的事情。但是会出现这个错误信息:"当前上下文中不存在“Url”的名称。

是否有其他函数可以用来生成url?


你的辅助类是什么?HtmlHelper<TModel> 扩展? - jrummell
只是一个普通的类文件,不是HtmlHelper扩展。 - qinking126
3个回答

12

在你的例子中,@UrlUrlHelper 类的一个实例。您可以创建它的一个实例并在任何类中使用,就像下面的示例一样,但是您需要访问相应视图的RequestContext(在我的示例中命名为 context)。

var urlHelper = new UrlHelper(context);
string absUrl = urlHelper.Action("ActionName", 
          "ControllerName", null, Request.Url.Scheme);

1
-1:有一种使用路由值字典的解决方案,不需要使用UrlHelper或访问上下文。请参见我的答案。 - JotaBe
问题是如何生成Url,而不是RedirectToRouteResult实例。 - Sergey Rybalkin
1
是的,你说得对。所以,我已经取消了我的反对票。(我进行了一个“虚拟编辑”,以便允许我取消我的反对票) - JotaBe

3
您无法在Razor视图之外使用Razor助手,@Url是Razor助手,仅适用于视图页面。不能在.NET类文件中使用。
请在您的类文件中尝试此示例。
var urlHelper = new UrlHelper(context);
string absUrl = Url.Action("Users", "Users",  new { Id = UserId, name =.NickName }, Request.Url.Scheme);

或者从控制器中使用以下代码:
return RedirectToAction("Profile", "Users", new { @Id = Model.UserId, name = Model.NickName })

1
我认为你的代码第二行有一个打字错误,当调用Action()时,应该使用你的urlHelper变量,而不是来自Razor的Url helper。 - Thiago Silva

1
您可以在任何地方使用此代码,不需要UrlHelper或上下文:
RouteValueDictionary rvd = new RouteValueDictionary
{
  {"controller", "ControllerName"}, 
  {"action", "ActionName"}, 
  {"area", ""}
};

VirtualPathData virtualPathData 
   = RouteTable.Routes.GetVirtualPath(null, new RouteValueDictionary());
return virtualPathData.VirtualPath;

这只有在属性 'HttpContext.Current' 不为空时才能运行,对于在 Web 应用中运行的代码是正确的。如果您不为 GetVirtualPath 提供第一个参数,则系统将使用上述静态属性返回的上下文。

因此,仍然可以使用此方法获取 URL 而无需提供上下文。

上下文始终是必要的,因为它具有服务器和虚拟目录(如果存在)的信息,其中应用程序正在运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接