2010-07-14 6 views
0

Je suis suivi par les exemples dans Professional ASP.Net MVC 2 et l'un des exemples ne fonctionne pas pour moi.TryUpdateModel ne fonctionne pas

[HttpPost] 
public ActionResult Edit (int id, FormCollection collection) 
{ 
    Dinner dinner = dinnerRepository.GetDinner(id); 
    if (TryUpdateModel(dinner)) 
    { 
     dinnerRepository.Save(); 
     return RedirectToAction("Details", new { id = dinner.DinnerID }); 
    } 
    return View(new DinnerFormViewModel(dinner)); 
} 

Je comprends qu'il est supposé prendre les valeurs de la FormCollection, puis mettre à jour l'objet de dîner avec lui, peu je ne vois pas la collection Référencez partout.

Merci pour votre aide, j'ai essayé de comprendre cela pour la maison passée.

+0

Pouvez-vous décrire le problème réel que vous rencontrez? Existe-t-il une exception, le dîner n'est-il pas mis à jour, etc.? –

+0

La mise à jour ne va pas bien. Il montre juste la vue avec les anciennes données. – PBG

Répondre

1

Pour répondre à vos préoccupations de collection n'étant référencé nulle part.

TryUpdateModel est une méthode de classe de base Controller qui effectue une liaison de modèle. Il y a beaucoup de choses impliquées dans ce processus mais, fondamentalement, il analyse les valeurs des requêtes (chaîne de requête, variables post, cookies, etc.) et les associe aux propriétés de l'objet passé à TryUpdateModel.

Strictement parlant, le paramètre FormCollection de la méthode d'action n'est pas nécessaire. TryUpdateModel devrait fonctionner sans elle.

1

Il existe plusieurs surcharges de la méthode TryUpdateModel(). La méthode TryUpdateModel < TModel> (modèle TModel) que vous utilisez tente de mettre à jour l'objet modèle transmis à partir de IValueProvider par défaut (instance de ValueProviderCollection contenant des instances de FormValueProvider, RouteDataValueProvider, QueryStringValueProvider et HttpFileCollectionValueProvider).     Le type FormCollection est une collection NameValueCollection qui comporte son propre CustomModelBinderAttribute qui se lie uniquement aux données de formulaire (c'est-à-dire, ne pas router les données, chaîne de requête, etc.) Votre méthode ne fait rien avec cette collection.

Il existe une autre surcharge de TryUpdateModel() que vous pouvez transmettre dans FormCollection (car FormCollection implémente IValueProvider) comme deuxième paramètre et qui mettrait à jour le modèle à partir des données de formulaire (si des données existaient). Si votre exemple ne fonctionne pas actuellement, il est probable que quelque chose d'autre ne fonctionne pas, comme aucune donnée affichée, etc. Toutes les données de formulaire seront également obtenues à partir de IValueProvider par défaut, donc si vous n'obtenez pas les données attendues Passer dans l'instance FormCollection ne va pas aider. Vous pouvez envisager de placer un point d'arrêt au début de votre méthode d'action et d'examiner la collection HttpContext.Request.Form pour voir à quelles données est publiée.