2010-10-22 9 views
2

J'essaie de savoir si je ne comprends pas quelque chose sur ASP.NET MVC ou si j'ai trouvé une sorte de bogue dans ASP.NET MVC Beta 3. J'ai un problème avec un PartialView ramasser le mauvais modèle lors de l'utilisation des extensions HTML HelperASP.NET MVC 3 et HTML Helper Extensions

Mon code de contrôleur ressemble à ceci:

public ActionResult EditGeneral(MapGeneralViewModel vm) 
{ 
    var query = MapGeneralViewModel.ToModel(vm, svcMaps); 

    return PartialView("General", MapGeneralViewModel.FromModel(query)); 
} 

Dans le cas de ce qui est un insert, la propriété vm.Id commence comme -1 et après l'appel à MapGeneralViewModel.ToModel it a été persisté la base de données et query.Id a une valeur correcte.

L'appel à MapSettingsViewModel.FromModel renvoie un nouveau viewmodel et j'ai vérifié que la propriété Id correcte contient la valeur d'identification nouvellement créée.

Les bits pertinents du point de vue ressemblent:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AdminWebRole.Models.Map.MapGeneralViewModel>" %> 
      <%: Model.Id %> 
      <%= Html.Hidden("IdTest", Model.Id) %> 
      <%= Html.HiddenFor(model => model.Id) %> 

Si je mets un point d'arrêt dans la vue, Model.Id est correctement réglée à la bonne valeur.

La sortie réelle du régulateur (quand Model.Id == 70) ressemble à ceci:

70 
    <input id="IdTest" name="IdTest" type="hidden" value="-1" /> 
    <input id="Id" name="Id" type="hidden" value="-1" /> 

Ainsi, la sortie de valeur sans utiliser les aides HTML est correct, mais la sortie des valeurs par la helpers est en quelque sorte ramasser le viewmodel qui a été transmis dans le contrôleur!

Je n'ai aucune idée de comment cela se passe. J'ai essayé différentes choses:

  • Utilisation View() plutôt que PartialView()
  • affectation des résultats de MapGeneralViewModel.FromModel() à vm et en faisant passer vm à la vue
  • en utilisant <%: et <% =
  • mise vm à null (l'ancien modèle de vue d'une certaine manière obtient encore utilisé)
  • changer la valeur de l'identifiant entrant à 0 (résultats à 0 étant sortie dans la vue au lieu de -1)
  • la problème n'est pas spécifique aux propriétés appelées "Id", j'ai également testé d'autres champs avec le même résultat

Suis-je confus sur la façon dont cela est censé fonctionner ou ai-je frappé un bêta bug? Si cela fait une différence, cela s'exécute dans mon environnement d'exécution Azure local sur une machine Win7 64 bits.

Répondre

1

Il est impossible que MVC prenne simplement en charge une variable que vous n'avez pas explicitement transmise à votre vue ou qui traîne dans Session ou TempData.

Puisque vous définissez cet Id à -1 je commence là pour des problèmes.

L'autre possibilité est que -1 se trouve quelque part dans votre ModelState. Les assistants HTML recherchent ModelState avant de décider d'utiliser les valeurs que vous passez.

+0

Il ne semble venir de la ModelState. En lisant cela, il me semble que je ne dois pas utiliser les HTML Helpers pour les propriétés du modèle qui ont changé depuis leur publication sur le contrôleur. Dans ce cas, ce sera juste la propriété Id. Cela a-t-il du sens ? – andynormancx

+0

@andynormancx, ouais, les HtmlHelpers gourmands ModelState mordent tout le monde il semble. – jfar

+0

Cela semble une façon très étrange de travailler. – andynormancx

1

Je viens de rencontrer un problème similaire dans une vue partielle que j'utilise pour afficher les éléments dans une commande. J'utilisais ce qui suit pour rendre une entrée cachée.

@Html.Hidden("salesorderlineid", orderLine.SalesOrderLineID)

Cela fonctionne bien jusqu'à ce que je supprime un élément, lorsque l'on utilise l'ID du mauvais (supprimé) élément. J'ai revérifié le modèle, c'était correct et rendu correctement dans d'autres usages sur la même vue.

J'ai codé l'entrée cachée directement comme html et cela fonctionne bien - ressemble peut-être à un bogue MVC3?

<input type="hidden" name="salesorderlineid" value="@orderLine.SalesOrderLineID"/>