2010-06-14 7 views
2

Cela semble que la liaison du modèle me cause des problèmes.Asp.Net MVC - Liaison du paramètre à la valeur du modèle!

Essentiellement, j'ai un modèle appelé ProductOption et dans le but de cette question, il dispose de 2 champs

ID (Int) PK ProductID (Int) FK

J'ai une route standard set-up

context.MapRoute(
     "Product_default", 
     "Product/{controller}/{action}/{id}", 
     new { controller = "Product", action = "Index", id = UrlParameter.Optional } 
    ); 

et si l'utilisateur veut ajouter une option l'URL est,

/Produit/Options/Ajout/1

dans l'URL ci-dessus 1 est le ProductID, j'ai le code suivant pour retourner un modèle en blanc la vue,

[HttpGet] 
public ActionResult Add(int id) 
{ 
    return View("Manage", new ProductOptionModel() { ProductID = id }); 
} 

maintenant à mon avis, je garde un champ caché

<%= Html.HiddenFor(x=>x.ID) %> 

Il est utilisé pour déterminer (à soumettre) si nous éditons ou l'ajout d'une nouvelle option. Cependant, le classeur Modèle dans .net semble remplacer .ID (Qui était 0 en quittant le précédent get actionresult) avec 1 (ou la valeur du paramètre id dans l'URL)

Comment puis-je arrêter ou contourner cela?

ViewModel

public class ProductExtraModel 
{ 
    //Database 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int ProductID { get; set; } 

    public ProductModel Product { get; set; } 
} 
+0

Votre code implique qu'il s'appelle ProductID dans le modèle pas .ID? – Andrew

+0

Pouvez-vous poster le code du modèle de vue? – Andrew

+0

@SocialAddict, terminé. – LiamB

Répondre

2

Je pense que le paramètre id est défini car par défaut , votre itinéraire le définit. À l'intérieur de votre contrôleur, vous définissez un paramètre supplémentaire dans votre ViewModel de ProductID, ceci sera probablement toujours égal au paramètre ID car les deux sont essentiellement définis sur le paramètre QueryString/GET. (1 dans ce cas).

Votre solution de changer l'itinéraire fonctionne comme vous l'arrêtez d'attribuer le paramètre ID semble un bon choix, mais peut-être pas idéal - selon la façon dont vous voulez résoudre le problème:

context.MapRoute(
    "Product_addoptionalextra", 
    "Product/{controller}/Add/{ProductID}", 
    new { controller = "Product",action="Add", ProductID = UrlParameter.Optional } 
); 

Alternativement, re -arrangez vos variables afin que ID soit réellement le ProductID pertinent, alors vous pourriez avoir OtherID qui représente l'ID.

La façon dont je suggérerais peut-être de résoudre ce problème si vous avez MVC 2, est d'utiliser EditorTemplates/DisplayTemplates. Bien que je ne connaisse pas votre ProductViewModel, je suppose qu'il a l'ID à l'intérieur. Si vous définissez le modèle approprié, vous pouvez presque oublier les ID qui se chevauchent.

public class ProductExtraModel 
{ 
    //Database 
    public int ID { get; set; } 
    public string Name { get; set; } 

    [UIHint("Product")] 
    public ProductModel Product { get; set; } 
} 

Vous serez en mesure d'accéder à l'ID du produit lorsque le modèle est repassée dans le contrôleur à l'aide productExtraViewModel.Product.ID et votre ID normale sera toujours disponible sur productViewModel.Id.

0

J'ai corrigé en mettant à jour mes itinéraires (pas completley heureux avec elle - mais il fonctionne)

public override void RegisterArea(AreaRegistrationContext context) 
     { 
      context.MapRoute(
       "Product_addoptionalextra", 
       "Product/{controller}/Add/{ProductID}", 
       new { controller = "Product",action="Add", ProductID = UrlParameter.Optional } 
      ); 

      context.MapRoute(
       "Product_default", 
       "Product/{controller}/{action}/{id}", 
       new { controller = "Product", action = "Index", id = UrlParameter.Optional } 
      );   
     } 
Questions connexes