gpt4 book ai didi

asp.net-mvc - 如何从我自己的 HtmlHelper 中访问 HtmlHelper 方法?

转载 作者:行者123 更新时间:2023-12-01 23:51:29 26 4
gpt4 key购买 nike

我正在为 ASP.NET MVC 编写自己的 HtmlHelper 扩展:

public static string CreateDialogLink (this HtmlHelper htmlHelper, string linkText, 
string contentPath)
{
// fix up content path if the user supplied a path beginning with '~'
contentPath = Url.Content(contentPath); // doesn't work (see below for why)

// create the link and return it
// .....
};

我遇到问题的地方是尝试从我的 HtmlHelper 的定义中访问UrlHelper。问题是您通常访问 HtmlHelper 的方式(通过 Html.MethodName(...) )是通过 View 上的属性。这对于我自己的扩展类来说显然是不可用的。

这是 ViewMasterPage 的实际 MVC 源代码(Beta 版) - 它定义了 HtmlUrl

public class ViewMasterPage : MasterPage
{
public ViewMasterPage();

public AjaxHelper Ajax { get; }
public HtmlHelper Html { get; }
public object Model { get; }
public TempDataDictionary TempData { get; }
public UrlHelper Url { get; }
public ViewContext ViewContext { get; }
public ViewDataDictionary ViewData { get; }
public HtmlTextWriter Writer { get; }
}

我希望能够在 HtmlHelper 中访问这些属性。

我想到的最好的就是这个(在 CreateDialogLink 方法的开头插入)

HtmlHelper Html = new HtmlHelper(htmlHelper.ViewContext, htmlHelper.ViewDataContainer);
UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

我是否缺少其他访问现有 HtmlHelperUrlHelper 实例的方法 - 或者我真的需要创建一个新实例吗?我确信没有太多开销,但如果可以的话,我更愿意使用预先存在的开销。

最佳答案

在问这个问题之前,我查看了一些 MVC 源代码,但显然我错过了这一点,这就是他们为图像助手所做的事情。

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "1#", Justification = "The return value is not a regular URL since it may contain ~/ ASP.NET-specific characters")]
public static string Image(this HtmlHelper helper, string imageRelativeUrl, string alt, IDictionary<string, object> htmlAttributes) {
if (String.IsNullOrEmpty(imageRelativeUrl)) {
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "imageRelativeUrl");
}

UrlHelper url = new UrlHelper(helper.ViewContext);
string imageUrl = url.Content(imageRelativeUrl);
return Image(imageUrl, alt, htmlAttributes).ToString(TagRenderMode.SelfClosing);
}

看起来实例化一个新的 UrlHelper 毕竟是正确的方法。这对我来说已经足够了。

<小时/>

更新:来自 ASP.NET MVC v1.0 Source Code 的 RTM 代码正如评论中指出的那样,略有不同。

文件:MVC\src\MvcFutures\Mvc\ImageExtensions.cs

 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "1#", Justification = "The return value is not a regular URL since it may contain ~/ ASP.NET-specific characters")]
public static string Image(this HtmlHelper helper, string imageRelativeUrl, string alt, IDictionary<string, object> htmlAttributes) {
if (String.IsNullOrEmpty(imageRelativeUrl)) {
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "imageRelativeUrl");
}

UrlHelper url = new UrlHelper(helper.ViewContext.RequestContext);
string imageUrl = url.Content(imageRelativeUrl);
return Image(imageUrl, alt, htmlAttributes).ToString(TagRenderMode.SelfClosing);
}

关于asp.net-mvc - 如何从我自己的 HtmlHelper 中访问 HtmlHelper 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/494345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com