2009-05-17 3 views
1

J'ai une action "Modifier" et une vue "Edition" pour permettre aux utilisateurs de mettre à jour une certaine entité dans la base de données. Le type de base de données est "XML", et le DataContext (j'utilise Linq-to-SQL) le représente comme une propriété de type "XElement".Liaison automatique d'une propriété "XElement" dans ASP.NET MVC

À mon avis, je rends un texte zone de la « ToString() » sortie du propery comme ceci:

<%= Html.TextArea("Text", Model.Text.ToString()) %> 

Cela fonctionne bien en tirant les données de l'objet, mais lorsque je tente pour afficher les nouvelles données, il revient en blanc.

Je pense que c'est parce que le classeur automatique ne sait pas comment traiter une propriété de type XElement.

Y a-t-il un moyen de résoudre ce problème, ou de personnaliser le comportement du classeur automatique afin qu'il désérialise correctement les données entrantes?

Répondre

2

Vous pouvez écrire un classeur personnalisé pour ce qui implémente l'interface IModelBinder. Vous pouvez enregistrer ce classeur sur la méthode elle-même:

public ActionResult Edit([ModelBinder(typeof(XElementBinder))] XElement element) 
{ ... } 

ou globalement pour tous les XElement « s dans votre application par registereing votre classeur dans Global.asax:

ModelBinders.Binders[typeof(IPrincipal)] = new PrincipalModelBinder(); 

votre classeur personnalisé ressemblerait à quelque chose comme ceci:

public class XElementModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
          ModelBindingContext bindingContext) 
    { 
     string text = controllerContext.HttpContext.Request.Form["Text"]; 
     XElement element = ...; 
     // Get XElement instance from posted data. 
     return element; 
    } 
} 
+0

Merci pour le conseil, travaillé sans faille. – Jonathan