Автоматическая привязка свойства «XElement» в ASP.NET MVC
-
22-08-2019 - |
Вопрос
У меня есть действие «Редактировать» и представление «Редактировать», позволяющее пользователям обновлять определенный объект в базе данных.
Тип базы данных — «XML», а DataContext (я использую Linq-to-SQL) представляет его как свойство типа «XElement».
На мой взгляд, я визуализирую текстовую область из вывода свойства "ToString()" следующим образом:
<%= Html.TextArea("Text", Model.Text.ToString()) %>
Это отлично работает при извлечении данных из объекта, но когда я пытаюсь отправить новые данные обратно, они возвращаются пустыми.
Я думаю, это потому, что автоматическое связывание не знает, как обращаться со свойством типа XElement.
Есть ли способ это исправить или как-то настроить поведение автосвязывания, чтобы оно правильно десериализовало входящие данные?
Решение
Для этого вы можете написать специальную связку, реализующую IModelBinder
интерфейс.Вы можете зарегистрировать этот связующий элемент в самом методе:
public ActionResult Edit([ModelBinder(typeof(XElementBinder))] XElement element)
{ ... }
или глобально для всех XElement
в вашем приложении, зарегистрировав подшивку в Global.asax
:
ModelBinders.Binders[typeof(IPrincipal)] = new PrincipalModelBinder();
Ваша специальная папка будет выглядеть примерно так:
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;
}
}