不能在类文件中使用Url.Action

时间:2012-05-29 19:05:18

标签: asp.net-mvc asp.net-mvc-3

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

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

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

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

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:2)

您不能在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 })

答案 2 :(得分:1)

您可以在任何地方使用此代码,并且您不需要UrlHelper或上下文:

RouteValueDictionary rvd = new RouteValueDictionary
{
  {"controller", "ControllerName"}, 
  {"action", "ActionName"}, 
  {"area", ""}
};

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

这仅在属性“HttpContext.Current”不为null时才有效,对于在Web应用程序中运行的代码也是如此。如果您没有为GetVirtualPath提供第一个参数,系统将找到使用上述静态属性返回的上下文。

因此,您可以使用此方法获取URL而不提供上下文。

上下文始终是必需的,因为它包含服务器的信息,以及应用程序运行时的虚拟指示(如果存在)。