Auto-unión de una propiedad “XElement” en ASP.NET MVC
-
22-08-2019 - |
Pregunta
Tengo un "Editar" acción y una vista "Editar" para permitir a los usuarios actualizar cierta entidad en la base de datos.
Es el tipo de base de datos es "XML" y el DataContext (estoy usando LINQ to SQL) representa como una propiedad de tipo "XElement".
En mi opinión, pagaré un texto-área de la "ToString ()" salida del hotel fenomenal como esto:
<%= Html.TextArea("Text", Model.Text.ToString()) %>
Esto funciona bien cuando se tira de los datos del objeto, pero cuando trato de publicar los nuevos datos de nuevo, vuelve en blanco.
Creo que esto es debido a que la auto-ligante no sabe cómo hacer frente a una propiedad de tipo XElement.
¿Hay una manera de solucionar este problema, o para personalizar de alguna manera el comportamiento del auto-ligante para que des-serializa los datos de entrada correctamente?
Solución
Puede escribir una carpeta de encargo para este que implementa el IModelBinder
interfaz. Puede registrar esta carpeta en el propio método:
public ActionResult Edit([ModelBinder(typeof(XElementBinder))] XElement element)
{ ... }
o de forma global para todos XElement
's en su aplicación por registereing su carpeta de Global.asax
:
ModelBinders.Binders[typeof(IPrincipal)] = new PrincipalModelBinder();
Su carpeta de encargo sería algo como esto:
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;
}
}