Auto-binding una proprietà “XElement” in ASP.NET MVC
-
22-08-2019 - |
Domanda
Ho un'azione "Modifica" e una visione "Modifica" per consentire agli utenti di aggiornare una certa entità nel database.
E 'tipo di database è "XML", e il DataContext (sto usando LINQ to SQL) rappresenta come una proprietà di tipo "XElement".
A mio parere, mi rendono un testo-area dalla "ToString ()" uscita del propery in questo modo:
<%= Html.TextArea("Text", Model.Text.ToString()) %>
Questo funziona bene quando si tira i dati dall'oggetto, ma quando provo ad inserire i nuovi dati indietro, si torna come vuota.
Credo che questo sia perché l'auto-legante non sa come comportarsi con una proprietà di tipo XElement.
C'è un modo per risolvere questo problema, o per personalizzare in qualche modo il comportamento della auto-legante in modo che deserializzi i dati in arrivo correttamente?
Soluzione
È possibile scrivere un raccoglitore personalizzato per questo che implementa il IModelBinder
interfaccia. È possibile registrare questo legante sul metodo stesso:
public ActionResult Edit([ModelBinder(typeof(XElementBinder))] XElement element)
{ ... }
o globalmente per tutti s 'nell'applicazione da registereing tuo legante in XElement
Global.asax
:
ModelBinders.Binders[typeof(IPrincipal)] = new PrincipalModelBinder();
Il raccoglitore personalizzato sarebbe simile a questa:
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;
}
}