2009-05-18 13 views
11

表示したい結果ごとに複数のページが表示されます。表示コードの重複を避けるため、カスタム表示ヘルパーを作成します。カスタムヘルパーからASP.NET MVC Htmlヘルパーを使用するには?

カスタムビューヘルパーから便利な既存のビューヘルパーにアクセスするにはどうすればよいですか?私。私のカスタムビューヘルパーでは、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.MvcHtmlHelpersへのアクセスを提供しますが、ActionLinkのような便利な方法の非は存在すると思われます。

答えて

8

この例は役立ちます。このヘルパーは、ユーザーがログインしているかどうかによって異なるリンクテキストを表示します。あなたはちょうどそのthis UrlHelper urlHelpと同じようなものでthis HtmlHelper helperのparamを交換するだろうUrl.Action()メソッドにアクセスするために行う必要があるでしょう
すべて:

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); 
    } 

EDITを:それは私のカスタムヘルパー内ActionLinkのの使用方法を示しています電話urlHelp.Action(...

希望します。

-1

私の意見では、コード内でActionLinkを使用しようとするべきではありません。 MVCの全概念は、ロジックを表示から分離することです。そのため、それに固執してください。

結果オブジェクトを(おそらくViewDataを通して)ビューに渡して、ビュー内のインライン結果を解析することをお勧めします。例えば

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

私はあなたの意見を見て同意します。しかし、それは私が避けようとしているいくつかの場所でパース/表示コード/ロジックを複製する必要があることを意味します。 – stpe

+1

あるヘルパーが別のヘルパーを呼び出せない理由はありません。 –

1

シンプルグラバターのhtml helpler、あなたのクラスも静的である必要があります。

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

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

    } 
0

あなたは(あなたがあなたの方法で最初のパラメータとしてxxxHelperを持っている)だけで拡張メソッドでデフォルトのHtmlHelperとUrlHelperを拡張することができます。

または、必要な方法で基本ビューを作成し、ビューのHTMLまたはURL変数を使用することができます。

関連する問題