aides HTML personnalisés: Créer aide avec « l'aide » support de déclaration
-
21-08-2019 - |
Question
J'écris mon premier asp.net et je demande mvc une question sur les aides Html personnalisés:
Pour faire un formulaire, vous pouvez utiliser:
<% using (Html.BeginForm()) {%>
*stuff here*
<% } %>
Je voudrais faire quelque chose de similaire avec un assistant HTML personnalisé. En d'autres termes, je veux changer:
Html.BeginTr();
Html.Td(day.Description);
Html.EndTr();
dans:
using Html.BeginTr(){
Html.Td(day.Description);
}
Est-ce possible?
La solution
Voici une implémentation réutilisable possible 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()
);
}
}
Dans ce cas, et BeginTr
écrire directement dans EndTr
le flux de réponse. Si vous utilisez des méthodes d'extension qui renvoient une chaîne, vous devrez les sorties en utilisant:
htmlHelper.ViewContext.HttpContext.Response.Write(s)
Autres conseils
J'ai essayé suivant les conseils donnés ici à MVC3, mais je suis tombé sur la difficulté à utiliser:
htmlHelper.ViewContext.HttpContext.Response.Write(...);
Quand j'utilisé ce code, mon aide a été écrit dans le flux de réponse avant ma mise en page a été rendue. Cela ne fonctionne pas bien.
Au lieu de cela je ceci:
htmlHelper.ViewContext.Writer.Write(...);
Si vous regardez la source pour le ASP.NET MVC (disponible sur Codeplex ), vous verrez la mise en œuvre du BeginForm appelle finalement vers le code suivant:
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 classe MvcForm implémente IDisposable, dans sa méthode est écrit le Éliminez à la réponse.
Alors, ce que vous devez faire est d'écrire les balises que vous voulez dans la méthode d'aide et retourner un objet qui implémente IDisposable ... dans sa méthode Éliminez fermer la balise off.