2010-04-15 5 views
1

Je suis extrêmement frustré d'essayer de passer à MVC après quelques années de développement webforms.DataBinding un DropDownList dans ASP.NET MVC 2

Voici mon problème extrêmement simple que je n'arrive pas à résoudre: J'ai une liste d'états dans une table appelée StateProvince. J'ai un DropDownList. Je veux que DropDownList affiche tous les états.

Restez simple, je ne sais rien à propos de MVC.

Voici ce que j'ai. Tout cela me donne un DropDownList rempli avec "System.Web.Mvc.SelectListItem".

Action:

public ActionResult Create() 
    { 
     var dbTimecard = new TimecardDbDataContext(); 
     IEnumerable<SelectListItem> stateProvinces = dbTimecard.StateProvinces.Select(p => new SelectListItem 
     { 
      Value = p.StateProvinceId.ToString(), 
      Text = p.Name 
     }); 
     SelectList theList = new SelectList(stateProvinces); 
     ViewData["StateProvince"] = theList; 
     return View(); 
    } 

Vue:

<div class="editor-label"> 
       <%: Html.LabelFor(model => model.StateProvinceId) %> 
      </div> 
      <div class="editor-field"> 
       <%: Html.DropDownListFor(model => model.StateProvinceId, (SelectList)ViewData["StateProvince"])%> 
       <%: Html.ValidationMessageFor(model => model.StateProvinceId) %> 
      </div> 
+0

est le Model.StateProvinces réellement rempli avec des objets ET le StateProvinceId contient une valeur non-null ET le modèle! = Null? – Michel

+0

Pouvez-vous montrer l'action? –

+0

Ok Je suppose que Create est votre GET ... où est le code qui gère le message et renvoie le résultat? C'est là que je pense que le problème est et ViewData n'est pas persisté entre les appels, mais je pourrais être totalement mal interpréter la question. Le problème est-il lors du chargement initial ou après la publication de vos résultats et la reconstruction de la vue? – Kelsey

Répondre

0

navigateurs communs ne prennent pas en charge PUT verbe dans les formulaires HTML. Vous pourriez avoir besoin de gérer cela en utilisant ajax:

$(function() { 
    // when some button is clicked: 
    $('#someButton').click(function() { 
     $.ajax({ 
      url: '/controller/action', 
      data: { selectedState: $('#StateProvinceId').val() }, 
      type: 'PUT', 
      success: function(data) { 
       alert('state successfully submitted'); 
      } 
     }); 
     return false; 
    }); 
}); 
+0

Désolé, je voulais dire POST. –

0

Lorsque les données est affiché, les éléments énumérés dans le DropDown ne sont pas réaffectés au modèle, donc je suppose que vous n'êtes pas les chercher à nouveau et les re-ajouter à votre modèle avant de retourner votre modèle à la vue.

Vous devez vous assurer sur votre poste que vous remplissez Model.StateProvinces, puis en le transmettant à votre vue. Seules les valeurs sont conservées contrairement à WebForms qui conserverait les DropDownList éléments dans le ViewState et les reconstruirait pour vous.

donc en supposant que votre contrôleur ressemble à quelque chose comme:

// POST: /YourController/YourAction/{ID} 
[HttpPost] 
public ActionResult YourAction(YourModel model, int id) 
{ 
    // model.StateProvinceId has the selected value 

    // you need to fill StateProvinces since it is empty as the list is not posted 
    // back so it is not autofilled into your model. 
    model.StateProvinces = LoadYourStateProvincesList(); 

    // This would blow up if StateProvinces is null because your View is assuming that 
    // it has a valid list of StateProvinces in it to build the DropDown 
    return View(model); 
} 

J'ai demandé en fait une une question tout à l'heure qui pourrait être utile pour aider à expliquer comment gérer les listes déroulantes:

Best way of implementing DropDownList in ASP.NET MVC 2?

EDIT: En fonction de votre commentaire, vous n'obtenez même pas la première liste ... eh bien, il semble que vous ne pouvez pas avoir votre configuration du modèle correctement. Avez-vous même un modèle? Votre création renvoie simplement View() sans données de modèle. Vous devez créer un modèle et le renvoyer.

Par exemple.

public class YourModel 
{ 
    public int StateProvinceId { get; set; } 
    /// ... whatever else you need 
} 

// Then in your view your controller you need to set it and create it 
View(new YourModel() { StateProvinceId = 123 };); 

Vous avez besoin du modèle de sorte que lorsque le formulaire est affiché en arrière, vous pouvez récupérer la valeur parce que MVC farcir la valeur dans votre modèle comme e exemple que j'ai posté ci-dessus en ce qui concerne la partie POST.

EDIT: Ok maintenant cette question est plus claire et beaucoup plus simple que la question initiale faisait le problème.Le problème est de vos besoins SelectList disent que ce champs à mettre où:

SelectList theList = new SelectList(stateProvinces, "Value", "Text"); 

Dans votre question initiale que vous aviez:

<%: Html.DropDownListFor(model => model.StateProvinceId, new SelectList(Model.StateProvinces, "StateProvinceId", "Name"))%> 

Ce qui était tout à fait correct, mais il a été la façon dont vous avez été la construction de Model.StateProvinces c'était faux, alors ça m'a découragé en pensant que ça devait être autre chose.

+0

Comment puis-je effectuer les opérations suivantes: Faire en sorte que DropDownList affiche une liste des lignes dans la table StateProvince avec le texte affiché dans DropDownList étant la colonne "Name" et la valeur étant la colonne "StateProvinceId". –

+0

Je veux dire, je ne suis même pas au point de tenter de POST de données pour le moment. –

+0

J'utilise un modelbinder pour le POST. –

1

Voici ce que je cherchais:

Action:

public ActionResult Create() 
    { 
     var dbTimecard = new TimecardDbDataContext(); 
     IEnumerable<SelectListItem> stateProvinces = dbTimecard.StateProvinces.Select(p => new SelectListItem 
     { 
      Value = p.StateProvinceId.ToString(), 
      Text = p.Name 
     }); 
     ViewData["StateProvince"] = stateProvinces; 
     return View(); 
    } 

Vue:

<div class="editor-field"> 
       <%: Html.DropDownListFor(model => model.StateProvinceId, (IEnumerable<SelectListItem>)ViewData["StateProvince"])%> 
       <%: Html.ValidationMessageFor(model => model.StateProvinceId) %> 
      </div> 
+1

Aucun modèle n'est assigné à la vue, alors comment 'model => model.StaeProvinceId' suppose-t-il de fonctionner? Découvrez l'édition que j'ai faite à ma réponse. – Kelsey

1

Essayez de remplacer cette

SelectList theList = new SelectList(stateProvinces); 

avec ce ...

SelectList theList = new SelectList(stateProvinces, "Value", "Text");