Автоматическое связывание свойства "XElement" в ASP.NET MVC - PullRequest
1 голос
/ 17 мая 2009

У меня есть действие «Изменить» и представление «Редактировать», чтобы пользователи могли обновлять определенную сущность в базе данных.

Это тип базы данных "XML", и DataContext (я использую Linq-to-SQL) представляет его как свойство типа "XElement".

На мой взгляд, я визуализирую текстовую область из вывода «ToString ()» свойства следующим образом:

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

Это прекрасно работает при извлечении данных из объекта, но когда я пытаюсь отправить новые данные обратно, они возвращаются пустыми.

Я думаю, это потому, что автобиндер не знает, как обращаться со свойством типа XElement.

Есть ли способ исправить это или как-то настроить поведение автоматического связующего, чтобы оно правильно десериализовало входящие данные?

1 Ответ

2 голосов
/ 17 мая 2009

Для этого можно написать пользовательское связующее, которое реализует интерфейс 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;
    }
}
...