3

在我的 asp.net mvc3 网站中,我Url.Action在视图中使用生成 url。

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

现在,在我的一个助手类中,我需要做同样的事情。但收到此错误消息,“当前上下文中不存在名称‘Url’。

我可以使用另一个函数来生成 url 吗?

4

3 回答 3

12

您的示例中的 @Url 是UrlHelper类的一个实例。您可以创建它的实例并在任何类中使用,如下例所示,但您需要访问RequestContext相应视图的(在我的示例中命名的上下文)。

var urlHelper = new UrlHelper(context);
string absUrl = urlHelper.Action("ActionName", 
          "ControllerName", null, Request.Url.Scheme);
于 2012-05-29T19:20:10.993 回答
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 })
于 2012-05-29T19:12:27.390 回答
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。

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

于 2013-07-09T11:25:49.320 回答