Question

J'ai beaucoup travaillé avec les formulaires Web asp.net et l'un d'entre eux me plait, c'est la cohérence avec le balisage généré, par exemple. si vous créez un contrôle composite pour un TextField, vous pouvez contrôler le balisage généré dans une classe unique, sans casser la SRP:

<form:textfield id="firstName" runat="server" required="true" label="First Name" />

Si vous allez générer le balisage à la main, il pourrait ressembler à ceci:

<label for="firstName" id="lbl_firstName">Name <span class="required">*</span></label>
<input id="firstName" name="firstName" type="text" value="" />

Le problème réside dans le moment où vous souhaitez modifier quelque chose, par exemple, ajoutez une division enveloppante ou déplacez la plage. Dans le pire des cas, vous devez modifier des milliers de vues.

C’est pourquoi j’aime vraiment le logiciel MVC Contrib FluentHtml.

<%= this.TextBox(x => x.Message.PostedBy).Class("required").Label("Name") %>

Ma question est la suivante: quel est le meilleur moyen d’ajouter une division à la ligne de code ci-dessus? Je pense que l'écriture manuscrite n'est pas une option à cause des arguments ci-dessus? Peut-être l'extension de la zone de texte: MvcContrib.FluentHtml.Elements.TextInput?

Était-ce utile?

La solution

avez-vous vérifié InputBuilder dans le projet MvcContrib? il est également utilisé dans Codecampserver. jetez un oeil et je pense que vous allez l'aimer.

Autres conseils

Honnêtement, je ne pense pas que le cas que vous avez cité s’applique au monde réel. Une zone de texte est une zone de texte. Si vous en avez besoin, vous en rendez un.
Si vous avez besoin de plus de "complexes" contrôle comme une zone de texte entourée d'une balise div , vous pouvez alors avoir une vue partielle pour cela.

Par exemple, Modèle:

public class CustomControlModel {
    public string Name { get; set; }
    public string Value { get; set; }
    public string Class { get; set; }
    public bool WrapInDivTag { get; set; }
    //you get the idea
}

Contrôle personnalisé:

<%@ Control Inherits="System.Web.Mvc.ViewUserControl<CustomControlModel>" %>
<%if (Model.WrapInDivTag) {%> <div> <% } %>
    <%=Html.TextBox(Model.Name, Model.Value, new { @class = Model.Class })%>
<%if (Model.WrapInDivTag) {%> </div> <% } %>

Et lors du rendu:

<%Html.RenderPartial("CustomControl", 
    new CustomControlModel { Name = "name", WrapInDivTag = true }); %>

C'est un exemple très simple, mais j'espère que cela explique pourquoi j'ai suggéré des points de vue partiels. N'oubliez pas que vous pouvez exposer une autre propriété pour obtenir la balise à rendre, etc.

.

Les InputBuilders sont une option. Avec FluentHtml, vous pouvez créer un élément personnalisé, semblable à ceci:

public class TextBoxInContainer : TextInput<TextBox>
{
    public TextBoxInContainer (string name) : base(HtmlInputType.Text, name) { }

    public TextBoxInContainer (string name, MemberExpression forMember, IEnumerable<IBehaviorMarker> behaviors) : base(HtmlInputType.Text, name, forMember, behaviors) { }

    protected override ToString()
    {
         divBuilder = new TagBuilder(HtmlTag.Div);
         divBuilder.InnerHtml = ToString();
         return divBuilder.ToString(TagRenderMode.SelfClosing);
    }
}

Pour utiliser ceci de votre vue, vous étendriez IViewModelContainer à quelque chose comme ça:

public static MyTextBox TextBoxInContainer <T>(this IViewModelContainer<T> view, Expression<Func<T, object>> expression) where T : class
{
    return new TextBoxInContainer (expression.GetNameFor(view), expression.GetMemberExpression(), view.Behaviors)
        .Value(expression.GetValueFrom(view.ViewModel));
}

Ensuite, si vous souhaitez modifier votre conteneur pour l'étendre à l'ensemble du site, modifiez la méthode ToString de TextBoxInContainer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top