如何从自定义帮助程序中使用ASP.NET MVC Html Helpers?

时间:2009-05-18 07:58:51

标签: asp.net-mvc

我有几个列出搜索结果的页面,对于我想要显示的每个结果,我想创建一个自定义的View Helper,以避免重复显示代码。

如何从自定义视图助手中访问方便的现有视图助手?即在我的自定义视图帮助器中,我想使用Url.Action(),Html.ActionLink等。如何从我的自定义视图助手中访问它们?

using System;
namespace MvcApp.Helpers
{
    public class SearchResultHelper
    {
        public static string Show(Result result)
        {
            string str = "";

            // producing HTML for search result here

            // instead of writing
            str += String.Format("<a href=\"/showresult/{0}\">{1}</a>", result.id, result.title);
            // I would like to use Url.Action, Html.ActionLink, etc. How?

            return str;
        }
    }
}

using System.Web.Mvc可以访问HtmlHelpers,但似乎没有像ActionLink这样的方便方法。

4 个答案:

答案 0 :(得分:9)

这个例子可以帮到你。此帮助程序根据用户是否登录来呈现不同的链接文本。它演示了在我的自定义助手中使用ActionLink:

    public static string FooterEditLink(this HtmlHelper helper,
        System.Security.Principal.IIdentity user, string loginText, string logoutText)
    {
        if (user.IsAuthenticated)
            return System.Web.Mvc.Html.LinkExtensions.ActionLink(helper, logoutText, "Logout", "Account",
                new { returnurl = helper.ViewContext.HttpContext.Request.Url.AbsolutePath }, null);
        else
            return System.Web.Mvc.Html.LinkExtensions.ActionLink(helper, loginText, "Login", "Account",
                new { returnurl = helper.ViewContext.HttpContext.Request.Url.AbsolutePath }, null);
    }

修改
要访问Url.Action()方法,您需要做的就是将this HtmlHelper helper param替换为this UrlHelper urlHelp之类的内容,然后只需调用urlHelp.Action(...

希望这有帮助。

答案 1 :(得分:1)

一个简单的gravatar html帮助器,你的也需要是静态的。

  public static string GetGravatarURL(this HtmlHelper helper, string email, string size, string defaultImagePath)
    {

        return GetGravatarURL(email, size) + string.Format("&default={0}", defaultImagePath);

    }

答案 2 :(得分:0)

你可以使用扩展方法扩展默认的HtmlHelper和UrlHelper(所以你在方法中将xxxHelper作为第一个参数)。

或者您可以使用所需的方法创建基本视图,并使用视图的Html或URL变量。

答案 3 :(得分:-1)

在我看来,您不应该尝试在代码中使用ActionLink。 MVC的整个概念是将逻辑与显示分开,所以你应该试着坚持下去。

我建议你将结果对象传递给视图(可能通过ViewData),然后在视图中内联解析结果。 e.g。

<%= Html.ActionLink(result.title,"/showresult/" + result.id, "myController") %>