2009-05-18 20 views
11

Mam kilka stron z listą wyników wyszukiwania, dla każdego wyniku chciałbym wyświetlić Chcę utworzyć niestandardowy pomocnik widoku, aby uniknąć powielania kodu wyświetlacza.Jak używać helperów ASP.NET MVC HTML z niestandardowego pomocnika?

Jak uzyskać dostęp do wygodnych istniejących pomocników widoku z mojego niestandardowego pomocnika widoku? To znaczy. w moim pomocniku widoku niestandardowego chciałbym użyć Url.Action(), Html.ActionLink, itp. Jak uzyskać do nich dostęp z mojego niestandardowego pomocnika widoku?

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 daje dostęp do HtmlHelpers, ale nie z dogodnych metod, takich jak actionlink wydają się być obecny.

Odpowiedz

8

Ten przykład powinien ci pomóc. Ten helper renderuje różne teksty linków w zależności od tego, czy użytkownik jest zalogowany, czy nie. To pokazuje zastosowanie actionlink wewnątrz mojego niestandardowego pomocnika:

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:
wszystko, czego trzeba zrobić, aby uzyskać dostęp do metody Url.Action() byłoby wymienić this HtmlHelper helper param z czymś jak this UrlHelper urlHelp a potem po prostu zadzwoń: urlHelp.Action(...

Mam nadzieję, że to pomoże.

-1

Moim zdaniem, nie powinieneś próbować używać ActionLink w kodzie. Cała koncepcja MVC polega na oddzieleniu logiki od wyświetlacza, więc powinieneś spróbować się z tym uporać.

Proponuję przekazać obiekt wynikowy do widoku (może poprzez ViewData), a następnie przeanalizować wynik w linii wewnątrz widoku. na przykład

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

Widzę twój punkt i zgadzam się. Jednakże oznaczałoby to, że muszę skopiować kod/logikę parse/display w kilku miejscach, czego staram się unikać. – stpe

+1

Nie ma powodu, dla którego jeden helper HTML nie może wywołać innego. –

1

Prosty gravatar html helpler, klasamusi być statyczna również.

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

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

    } 
0

można rozszerzyć domyślnego HtmlHelper i UrlHelper tylko o metodę rozszerzenia (tak masz xxxHelper jako pierwszy param w swojej metody).

Lub możesz po prostu utworzyć widok podstawowy za pomocą wybranej metody i użyć zmiennej HTML lub URL widoku.

Powiązane problemy