textboxfor son que net mvc los asp .net asp.net-mvc html-helper

.net - son - html textbox asp net



Ayudantes html personalizados: Crear ayuda con soporte de instrucciones "using" (3)

Estoy escribiendo mi primera aplicación asp.net mvc y tengo una pregunta sobre los ayudantes Html personalizados:

Para hacer un formulario, puede usar:

<% using (Html.BeginForm()) {%> *stuff here* <% } %>

Me gustaría hacer algo similar con un ayudante HTML personalizado. En otras palabras, quiero cambiar:

Html.BeginTr(); Html.Td(day.Description); Html.EndTr();

dentro:

using Html.BeginTr(){ Html.Td(day.Description); }

es posible?


Aquí hay una posible implementación reutilizable en c #:

class DisposableHelper : IDisposable { private Action end; // When the object is created, write "begin" function public DisposableHelper(Action begin, Action end) { this.end = end; begin(); } // When the object is disposed (end of using block), write "end" function public void Dispose() { end(); } } public static class DisposableExtensions { public static IDisposable DisposableTr(this HtmlHelper htmlHelper) { return new DisposableHelper( () => htmlHelper.BeginTr(), () => htmlHelper.EndTr() ); } }

En este caso, BeginTr y EndTr escriben directamente en la secuencia de respuesta. Si usa métodos de extensión que devuelven una cadena, deberá generarlos usando:

htmlHelper.ViewContext.HttpContext.Response.Write(s)


Intenté seguir los consejos dados aquí en MVC3, pero tuve problemas al usar:

htmlHelper.ViewContext.HttpContext.Response.Write(...);

Cuando usé este código, mi ayudante estaba escribiendo en la secuencia de respuesta ANTES de que mi diseño se procesara. Esto no funcionó bien

En cambio, utilicé esto:

htmlHelper.ViewContext.Writer.Write(...);


Si nos fijamos en el origen de ASP.NET MVC (disponible en Codeplex ), verá que la implementación de BeginForm eventualmente llama al siguiente código:

static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes) { TagBuilder builder = new TagBuilder("form"); builder.MergeAttributes<string, object>(htmlAttributes); builder.MergeAttribute("action", formAction); builder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true); htmlHelper.ViewContext.HttpContext.Response.Write(builder.ToString(TagRenderMode.StartTag)); return new MvcForm(htmlHelper.ViewContext.HttpContext.Response); }

La clase MvcForm implementa IDisposable, en su método de eliminación escribe la </ form> a la respuesta.

Entonces, lo que tendría que hacer es escribir las etiquetas que desea en el método de ayuda y devolver un objeto que implemente IDisposable ... en su método de eliminación cierre la etiqueta.