2011-11-07 1 views
2

Je suis un débutant à propos de Razor, et parfois je suis coincé avec des choses vraiment simples.MVC3 et Razor - Comment placer une valeur dynamique pour un champ caché?

J'ai cette boucle foreach:

@foreach (dynamic item in ViewBag.EAList) 
{ 
<li> 
    @using (@Html.BeginForm("Duplicate, "Daily")) 
    { 
     <p>@item.AuthorComment</p> 
     @Html.Hidden("EstadoDeAlmaID", @item.EAID) 
     @Html.Hidden("PosterID", Session["id"].ToString()) 
     <input type="submit" value="Send" /> 
    } 
</li> 
} 

Cette ligne:

@Html.Hidden("EstadoDeAlmaID", @item.EAID) 

ne fonctionne pas, et je ne sais pas comment le faire fonctionner, j'ai essayé plusieurs façons, sans @, avec (-), avec @ (-) ...

Quelqu'un pourrait-il m'aider à afficher la valeur dynamique dans mon champ masqué? En outre, si quelqu'un sait sur un bon site Web échantillons Razor, je serais très reconnaissant.

+0

Avez-vous essayé: @ Html.Hidden ("EstadoDeAlmaID", item.EAID)? – gdoron

+0

Oui, et j'obtiens l'erreur: CS1973: 'System.Web.Mvc.HtmlHelper ' n'a aucune méthode applicable nommée 'Caché' mais semble avoir une méthode d'extension par ce nom. Les méthodes d'extension ne peuvent pas être distribuées dynamiquement. Pensez à lancer les arguments dynamiques ou à appeler la méthode d'extension sans la syntaxe de la méthode d'extension. –

+0

C'est votre problème, @Gardini. gdoron a raison de dire comment vous devriez l'appeler ... alors voir ma réponse; vous utilisez le type dynamique, mais les méthodes d'extension ne peuvent pas fonctionner avec cela. –

Répondre

2

Pour éviter les méthodes d'extension ne peuvent pas être répartis dynamiquement exception, utilisez un modèle au lieu de ViewBag si vous ne comptez pas utiliser dynamic objets (cela évitera toute la coulée inutile dans la vue et est plus en ligne avec le style MVC en général):

dans votre action lorsque vous revenez la vue:

return View("ViewName", db.EAList.ToList()); 

à votre avis, la première ligne devrait être:

@model IEnumerable<EAListItem> //or whatever the type name is 

Ensuite il suffit de faire:

@foreach(var item in Model) 
+0

Lorsque je fais cela, je reçois l'erreur: CS1579: foreach instruction ne peut pas fonctionner sur des variables de type 'MvcWebRole1.Models.DiaryPosts' car 'MvcWebRole1.Models.DiaryPosts' ne contient pas de définition publique pour 'GetEnumerator' –

+0

Ah désolé, faute de frappe de ma part dans le 2ème exemple de code. Je l'ai recommandé, il devrait avoir 'IEnumerable ' ou 'Liste ' où 'EAListItem' est votre type de ligne ... –

+0

Je suis très nouveau à MVC3, rasoir et EF, je ne peux pas obtenir quelle classe devrais-je mettre à l'intérieur de l'élément List <>, je n'ai que des classes générées par le générateur DBContext. Je ne sais pas comment travailler avec cela de manière plus avancée. J'ai résolu mon problème en utilisant comme ceci: int EAID = item.EstadoDeAlmaID; @ Html.Hidden ("EstadoDeAlmaID", EAID) Je sais que c'est stupide mais ça marche. –

4

Dans Razor, une fois que vous êtes en "C# land", vous n'avez plus besoin de préfixer les valeurs avec le signe @.

Cela devrait suffire:

@Html.Hidden("EstadoDeAlmaID", item.EAID) 

Découvrez Scott Gu's article couvrant la syntaxe pour plus d'aide.

Mise à jour

Et je propose aussi votre <li></li> au sein de votre bloc à l'aide, comme rasoir fonctionne mieux lorsque vous enveloppez blocs HTML à l'intérieur d'un bloc de code.

En outre, votre Html.BeginForm devrait vivre en dehors de votre boucle.

@using (@Html.BeginForm("Duplicate, "Daily")) 
{ 
    <ul> 
     @foreach (? item in ViewBag.EAList) 
     { 
      <li> 
       <p>@item.AuthorComment</p> 
       @Html.Hidden("EstadoDeAlmaID", item.EAID) 
       @Html.Hidden("PosterID", Session["id"].ToString()) 
       <input type="submit" value="Send" /> 
      </li> 
     } 
    </ul> 
} 

? dans la boucle foreach est le type de vos articles dans EAList.

+0

Je ne pense pas que ce soit une bonne idée de mettre une balise de forme * en dehors des balises li. C'est html invalide. Seuls les tags li sont légaux en tant que descendants directs de ul ou ol. –

+0

Désolé, je supposais que l'OP avait déjà inclus 'ul' /' ol' ailleurs. Mais vous avez raison, ceux-ci devraient envelopper les balises 'li'. –

+0

aussi, alors que vous avez raison de faire cet appel ... cela ne réglera pas le problème. Voir ma réponse pour pourquoi. –

1

Vous avez l'erreur "Les méthodes d'extension ne peuvent pas être réparties dynamiquement" ... c'est là que réside votre problème.

Vous devez déclarer que votre variable de boucle ne doit pas être de type dynamique, mais du type réel dans la collection. Ensuite, supprimez le @ de l'appel item.EAID dans l'appel @ Html.Hidden().

+0

J'ai changé ma boucle en @foreach (var item dans ViewBag.EAList), et j'ai supprimé @ de la variable item, elle a la même erreur. –

+0

Non var. Le type réel de la collection. Vous pouvez également ajouter ViewBag.EAList comme ActualListType pour être sûr. –

+0

Mon appel dans le contrôleur est "ViewBag.EAList = db.EAList.ToList();" quel devrait être mon type de variable dans ma vue? –

0

La solution simple pour moi était d'utiliser ViewData au lieu de ViewBag. ViewBag est juste une enveloppe dynamique autour de ViewData quand même.

@Html.Hidden("ReportID", ViewData["ReportID"]) 

mais je ne sais pas si cela vous aidera dans votre cas ou non, puisque vous créez des éléments dynamiques dans votre boucle foreach.

6

J'ai eu le même problème, trouvé qu'un simple casting a résolu mon problème.

@ Html.Hidden (« id », (string) ViewBag.ebook.isbn)

0

j'ai trouvé que lorsque je veux utiliser les données de sac vue dans le code HTML Pour en revenir à l'essentiel a souvent travaillé pour moi

<input type="hidden" name="Data" id="Data" value="@ViewBag.Data" /> 

cela a donné le même résultat.

Questions connexes