2011-03-17 4 views
0

J'ai un modèle appelé Projet, qui a les propriétés suivantes (simplifié par souci de brièveté).MVC2 ModelBinder non lié à la propriété 'id' du modèle

[DataContract(IsReference = true)]  
public class Project 
{ 
    [Key] 
    [DataMember] 
    public int id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public DateTime CreatedDate { get; set; } 
} 

Le modèle est aussi un DataContract pour un service WCF qui utilise Entity Framework 4 pour interroger un datastore. Le code du modèle est généré à partir d'un modèle qui génère automatiquement une couche de service CRUD par rapport au modèle Entity Framework. Maintenant, mon application MVC2 a une vue contenant un formulaire pour éditer les champs. L'action Editeurs du contrôleur accepte le modèle entier en tant qu'argument lors du POST.

[HttpPost]  
public ActionResult Edit(Project project)  
{   
    var context = new ServiceContext();    
    try    
    { 
     if (ModelState.IsValid) 
     { 
      project = context.UpdateProject(project); 
      return RedirectToAction("Index"); 
     }   
    }   
    catch 
    { 
     ModelState.AddModelError("", "Could not save project");    
    } 

    return View(project);  
} 

Maintenant, mon problème est que lorsque le formulaire est affiché au contrôleur, le modèle du projet a tous ses champs peuplés correctement sauf pour la propriété « id », qui par défaut 0.

Je l'ai fait quelques recherches et supplié oncle Google pour trouver des réponses, mais le plus proche solution que je pouvais obtenir était d'ajouter ce qui suit à la classe du modèle,

[Bind(Include="id")] 

qui fonctionne très bien, mais ne remplit que la propriété « id » , ce qui signifie que Je devrais spécifier explicitement chaque propriété à inclure dans la liaison du modèle. Évidemment, cela peut être méchant, d'autant plus que le modèle lui-même a beaucoup plus de propriétés que celui que j'ai montré ci-dessus.

Existe-t-il un autre moyen d'obtenir ce fonctionnement? L'intuition est que l'attribut [Key] a quelque chose à voir avec ça, mais je n'ai rien trouvé.

Le formulaire a une entrée masquée pour la propriété 'id'.

<%: Html.HiddenFor(model => model.id)%> 

Répondre

0

Je pense avoir trouvé la solution. Mon modèle a également des propriétés complexes qui mappent aux tables liées dans mon modèle de structure d'entité. Maintenant, puisque j'utilise les modèles T4 d'entités de suivi automatique pour générer ma couche de service, il a une logique supplémentaire quand il s'agit de mapper des valeurs à des entités. Dans ce cas, l'une des propriétés complexes est une classe appelée statut qui ressemble à ceci:

public class Status 
{ 
    public int ProjectId { get; set; } 
    public int StatusId { get; set ; } 
} 

Le ProjectID est une clé étrangère à la table du projet dans mon magasin de données. J'ai remarqué que le champ ProjectId a également été mis à 0 pendant la liaison de modèle.

Quand j'ajouté ce qui suit à mon avis

<%: Html.HiddenFor(model => model.Status.ProjectId) %> 

les deux champs ont la valeur correcte affichée au contrôleur.

Problème résolu :)

Merci swapneel pour vos réflexions sur la question.

1

Essayez d'ajouter champ caché supplémentaire pour ID comme <%: Html.HiddenFor (modèle => model.Id)%>

+0

Merci, c'est déjà un champ caché sur le formulaire (j'ai oublié de le montrer sur ma question d'origine). Il ne fonctionne toujours pas ... – tobias86

+0

en supprimant l'attribut [Clé] - est-ce que mvc poste ID dans viewmodel – swapneel

+0

Non, il ne le fait pas. Mais cela m'a mis sur la bonne voie. Merci! Voir ma réponse ci-dessous – tobias86

Questions connexes