在HTML助手中生成URL
在HTML助手中生成URL
在ASP.NET视图中,通常可以使用以下函数来获取URL(不是标签):\n
Url.Action(\"Action\", \"Controller\");
\n然而,我找不到如何在自定义HTML助手中实现这个功能。我有以下代码:\n
public class MyCustomHelper { public static string ExtensionMethod(this HtmlHelper helper) { } }
\nhelper变量具有Action和GenerateLink方法,但它们生成的是标签。我在ASP.NET MVC源代码中进行了一些调查,但没有找到直接的方法。\n问题在于上面的Url是视图类的成员,它在实例化时需要一些上下文和路由映射(我不想处理这些,而且我也不应该处理)。另外,HtmlHelper类的实例也具有一些上下文信息,我认为这些信息可能是Url实例的超集或子集(但我也不想处理它)。\n总之,我认为这是可能的,但是由于我看到的所有方法都涉及到一些更多或更少的内部ASP.NET内容的操作,所以我想知道是否有更好的方法。\n编辑:例如,我看到的一种可能性是:\n
public class MyCustomHelper { public static string ExtensionMethod(this HtmlHelper helper) { UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext); urlHelper.Action("Action", "Controller"); } }
\n但这似乎不正确。我不想自己处理UrlHelper的实例。一定有更简单的方法。
从上述内容中,我们可以看到这个问题的出现原因是因为在使用ASP.NET 4.5时出现了重入问题,认为UrlHelper不能在HTTP请求之间重用。
解决方法是通过创建一个扩展方法,获取HtmlHelper的UrlHelper实例,并在需要使用UrlHelper的地方调用这个扩展方法。
下面是整理后的
在ASP.NET中,有时我们需要在HTML助手(HtmlHelper)中生成URL。在ASP.NET 4.5中,我们发现了一个问题,即在处理HTTP请求时出现了重入问题。我们怀疑这个问题与UrlHelper的重用有关。
为了解决这个问题,我们创建了一个扩展方法,用于获取HtmlHelper的UrlHelper实例。这个扩展方法如下所示(代码见上方):
public static partial class UrlHelperExtensions { ////// Gets UrlHelper for the HtmlHelper. /// /// The HTML helper. ///public static UrlHelper UrlHelper(this HtmlHelper htmlHelper) { if (htmlHelper.ViewContext.Controller is Controller) return ((Controller)htmlHelper.ViewContext.Controller).Url; const string itemKey = "HtmlHelper_UrlHelper"; if (htmlHelper.ViewContext.HttpContext.Items[itemKey] == null) htmlHelper.ViewContext.HttpContext.Items[itemKey] = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection); return (UrlHelper)htmlHelper.ViewContext.HttpContext.Items[itemKey]; } }
通过使用这个扩展方法,我们可以在需要生成URL的地方调用`UrlHelper()`方法,如下所示:
public static MvcHtmlString RenderManagePrintLink(this HtmlHelper helper, ) { var url = htmlHelper.UrlHelper().RouteUrl('routeName'); //... }
这种方法的优点在于它重用了现有的对象,而不是创建一个新的对象。这样可以避免重入问题的发生。
因此,通过创建一个扩展方法来获取HtmlHelper的UrlHelper实例,我们解决了在ASP.NET 4.5中出现的重入问题。
问题出现的原因是想要在HTML帮助器中生成URL。解决方法是使用UrlHelper
公共静态类来生成URL,而不是创建新的UrlHelper类。这种方法的优势是可以设置RouteCollection。下面是一个示例代码:
UrlHelper.GenerateUrl(null, actionName, controllerName, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true)
通过以上方法,我们可以很方便地在HTML帮助器中生成URL。
问题:Generate URL in HTML helper的出现原因和解决方法
原因:
问题的出现是因为在创建URL Helper时,只使用了一个参数来初始化UrlHelper对象。该参数是ViewContext.RequestContext,这个参数用于创建UrlHelper对象所需的上下文信息,包括当前请求的路由数据。然而,在初始化UrlHelper对象时,没有同时初始化RouteCollection,这可能会导致一些问题,例如在生成URL时可能无法正确地找到正确的路由。
解决方法:
为了解决这个问题,可以在初始化UrlHelper对象时,使用一个额外的参数来初始化RouteCollection。这样,UrlHelper对象将可以正确地访问和使用当前应用程序的路由集合,以生成正确的URL。
下面是解决方法的示例代码:
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection); var url = urlHelper.Action("Home", "Index");
通过使用上述代码,我们可以确保UrlHelper对象在生成URL时可以正确地访问和使用当前应用程序的路由集合,从而避免由于缺少RouteCollection而导致的问题。这样,我们就可以正确地生成URL了。