.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.