textboxfor net mvc labelfor htmlhelper htmlattributes asp asp.net asp.net-mvc-3 razor htmlextensions

asp.net - net - MVC 3 método de extensión htmlhelper para envolver el contenido



textboxfor asp net mvc (3)

Busqué, pero no pude encontrar ninguna solución rápida para un htmlhelper MVC 3 para crear un método de envoltura. Lo que busco es algo como:

@html.createLink("caption", "url") { <html> content in tags </html> }

el resultado debería tener

<a href="url" title="Caption"> <html> content in tags </html> </a>

Cualquier ayuda con esto.


En su nivel más simple algo como esto lo haría

public static MvcHtmlString SomeLink(this HtmlHelper htmlHelper, string href, string title, string content ) { var urlHelper = ((Controller)htmlHelper.ViewContext.Controller).Url; //var url = urlHelper.Action(actionName, controllerName, routeValues); var someLink = new TagBuilder("a"); someLink.MergeAttribute("href", href); someLink.InnerHtml = content; return new MvcHtmlString(someLink.ToString()); }


La forma en que esto se hace con BeginForm es que el tipo de retorno MvcForm IDisposable para que cuando se usa dentro de una instrucción using , el método Dispose de MvcForm escriba la etiqueta de cierre </form> .

Puedes escribir un método de extensión que haga exactamente lo mismo.

Aquí hay uno que acabo de escribir para demostrar.

En primer lugar, el método de extensión:

public static class ExtensionTest { public static MvcAnchor BeginLink(this HtmlHelper htmlHelper) { var tagBuilder = new TagBuilder("a"); htmlHelper.ViewContext.Writer .Write(tagBuilder.ToString( TagRenderMode.StartTag)); return new MvcAnchor(htmlHelper.ViewContext); } }

Y aquí está nuestro nuevo tipo, MvcAnchor:

public class MvcAnchor : IDisposable { private readonly TextWriter _writer; public MvcAnchor(ViewContext viewContext) { _writer = viewContext.Writer; } public void Dispose() { this._writer.Write("</a>"); } }

En tus vistas ahora puedes hacer:

@{ using (Html.BeginLink()) { @Html.Raw("Hello World") } }

Lo que da el resultado:

<a>Hello World</a>

Ampliando esto ligeramente para satisfacer su requisito exacto:

public static MvcAnchor BeginLink(this HtmlHelper htmlHelper, string href, string title) { var tagBuilder = new TagBuilder("a"); tagBuilder.Attributes.Add("href",href); tagBuilder.Attributes.Add("title", title); htmlHelper.ViewContext.Writer.Write(tagBuilder .ToString(TagRenderMode.StartTag)); return new MvcAnchor(htmlHelper.ViewContext); }

y nuestra opinión:

@{ using (Html.BeginLink("http://.com", "The Worlds Best Q&A site")) { @Html.Raw(" - Because we really do care") } }

que da el resultado:

<a href="http://.com" title="The Worlds Best Q&amp;A site"> - Because we really do care</a>


También hay otra forma, sin truco desechable. Es menos trabajo, ideal para pequeños ayudantes. Respondí una pregunta similar y no quiero copiar todo, pero aquí hay un breve ejemplo:

@helper Paragraph(string cssClass, Func<object, object> markup) { <p class="@cssClass">@markup.DynamicInvoke(this.ViewContext)</p> }

El uso de este ayudante se ve así:

@Paragraph("highlited", @<text> Look, a @Html.ActionLink("link", "index") </text> )

Mi respuesta completa a la otra pregunta similar here .