2009-05-18 23 views
11

Tengo varias páginas que enumeran los resultados de búsqueda, por cada resultado que me gustaría mostrar Deseo crear un Asistente de visualización personalizado para evitar la duplicación del código de visualización.Cómo usar ASP.NET MVC Html Helpers desde un ayudante personalizado?

¿Cómo accedo a los prácticos ayudantes de visualización existentes desde mi asistente de visualización personalizado? Es decir. en mi asistente de visualización personalizada me gustaría usar Url.Action(), Html.ActionLink, etc. ¿Cómo accedo a ellos desde mi asistente de visualización personalizado?

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 da acceso a HtmlHelpers, pero no de los métodos convenientes como ActionLink parecen estar presentes.

Respuesta

8

Este ejemplo debería ayudarlo. Este ayudante representa un texto de enlace diferente dependiendo de si el usuario está conectado o no. Se demuestra el uso de ActionLink dentro de mi encargo ayudante:

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:
Todo lo que tendría que hacer para tener acceso al método Url.Action() sería la de sustituir el parámetro this HtmlHelper helper con algo como this UrlHelper urlHelp y luego simplemente llame al urlHelp.Action(...

Espero que esto ayude.

-1

En mi opinión, no deberías estar tratando de usar ActionLink dentro del código. Todo el concepto de MVC es separar la lógica de la pantalla, por lo que debes intentar seguir con eso.

Le sugiero que pase el objeto del resultado a la vista (tal vez a través de ViewData) y luego analizar el resultado en línea dentro de la vista. p.ej.

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

Veo su punto y estoy de acuerdo. Sin embargo, eso significaría que necesito duplicar el código/lógica de análisis/visualización en varios lugares, que es lo que trato de evitar. – stpe

+1

No hay una buena razón para que un helper html no pueda llamar a otro. –

1

Un simple helpler html gravatar, su clase detiene que ser estática también.

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

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

    } 
0

se puede ampliar el HtmlHelper defecto y UrlHelper acaba con un método de extensión (por lo que tiene la xxxHelper como primer parámetro en el método).

O puede simplemente crear su vista base con el método que desee y usar la variable Html o URL de la vista.

Cuestiones relacionadas