MVC une vue partielle (ou modèles de l'éditeur): Index append pour nom d'entrée pour une utilisation multiple de la forme?

StackOverflow https://stackoverflow.com/questions/6328582

Question

Comment puis-je ajouter un index, aux noms d'entrée et ids sous des formes qui sont utilisés plusieurs fois dans une vue?

J'ai créé une forme de rotateur de photo qui offre la possibilité de modifier une légende spécifique-contexte pour chaque photo (panneau d'affichage). Je dois être en mesure d'inclure plusieurs instances des champs de formulaire pour ce afin que les administrateurs peuvent modifier tous les sous-titres pour l'ensemble de photos d'un dispositif de rotation dans une vue, et donc je besoin d'un moyen de garder ids et les noms de champ unique.

Modèles editeur automatiquement un préfixe, mais quand je boucle sur les photos comme ceci:

<% foreach (var billboard in Model.Billboards ) {  %>
    <%: Html.EditorFor(x => billboard, "BillboardForm")%>
<% } %>

Il ajoute simplement « billboard_ » comme préfixe, ce qui ne résout pas mon problème.

Je voudrais ajouter la id rotateurs id panneau d'affichage à la fin de chaque nom d'entrée et id:

<form action="/Rotators/Edit/5" method="post">                  
    <input id="billboard_21_RotatorId" name="billboard_21_RotatorId" type="hidden" value="5" /> 
    <input id="billboard_21_ImageId" name="billboard_21_ImageId" type="hidden" value="19" />
    <label for="billboard_21_Title">Title</label>
    <textarea cols="20" id="billboard_21_Title" name="billboard_21_Title" rows="2">Title</textarea>
    <label for="billboard_21_Caption">Caption</label>
    <textarea cols="20" id="billboard_21_Caption" name="billboard_21_Caption" rows="2">This is the caption</textarea>
    <select id="billboard_21_TopicId" name="billboard_21_TopicId">
        <option value="1">1st option</option>                   
    </select>
</form>

De toute façon facile de le faire ??

Était-ce utile?

La solution

plz télécharger ce code sampel blog steve sanderson. elle ne se rapporte pas directement à votre question. Mais en projet de démonstration, vous trouverez BeginCollectionItem html aide qui est en train de changer le champ de préfixe pour l'entrée ou d'une série d'entrées. Cela peut donner u point de départ
Edit: dans ur modèle d'éditeur u peut utiliser la méthode suivante à partir du code de steve comme

using(Html.BeginHtmlFieldPrefixScope("BillBoard" + Model.ID.ToString())){
<label>Image<label>
@Html.TextBoxFor(x=>x.Image)
<label>Caption</label>
@Html.TextBoxFor(x=>x.Caption)
}

si l'ID est la propriété de votre modèle et a une valeur 4 alors u par exemple aura html comme

<label>Image</label>
<input name = "BillBoard4.Image" .../>
<label>Caption</label>
<input name = "BillBoard4.Caption" .../>

Autres conseils

Remarque: Les caractéristiques utilisées ci-dessous peuvent ne pas avoir existé il y a 4 ans ... Tout d'abord, vous ne devez pas utiliser beestings plus, la syntaxe utilisée @ dans les exemples de rasoir est beaucoup plus propre.

La méthode que vous appelez est en System.Web.Mvc.Html.EditorExtensions:

public static MvcHtmlString EditorFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression
)
...

Votre approche:

@foreach (var billboard in Model.Billboards ) {
   @Html.EditorFor(x => billboard, "BillboardForm")
}

Le corps d'expression x => billboard est un ConstantExpression.

Cette approche dans le cadre approprié d'application dans le EditorTemplate:

@for (var i = 0; i < Model.BillBoards.Count(); i++)
{
    @Html.EditorFor(x => Model.BillBoards[i], "BillboardForm")
}

Si Model.BillBoards est un tableau, le x => Model.BillBoards[i] d'expression peut être décrit comme

SimpleBinaryExpression{NodeType:ArrayIndex}(
    Left: ConstantExpression,
    Right: ConstantExpression
)

Si Model.BillBoards est un IList<T>, l'expression x => Model.BillBoards[i] peut être décrit comme

InstanceMethodCallExpressionN(
    Method:RuntimeMethodInfo(IList<T>.get_Item (Int32 index)),
    Object:PropertyExpression(ConstantExpression),
    Arguments:[ConstantExpression]
)

Les EditorFor() de qui surcharge acceptent des expressions vérifier le type et NodeType et construire la portée du corps d'expression en conséquence.

Ce code devrait être équivalent si vous n'avez rien d'autre à l'intérieur de la boucle:

@Html.EditorFor(x => Model.BillBoards, "BillboardForm")

Si vous avez seulement une vue en lecture seule et une vue d'édition, vous pouvez renommer vos modèles et de supprimer le second paramètre. Si l'on suppose BillBoard est votre classe modèle, changement de nom BillboardForm.cshtml à EditorTemplates/BillBoard.cshtml, puis modifiez le code

@Html.EditorFor(x => Model.BillBoards)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top