在ASP.NET MVC中自动绑定“XElement”属性

时间:2009-05-17 08:02:54

标签: xml asp.net-mvc xelement

我有一个“编辑”操作和一个“编辑”视图,允许用户更新数据库中的某个实体。

它的数据库类型是“XML”,DataContext(我使用的是Linq-to-SQL)将其表示为“XElement”类型的属性。

在我看来,我从这个主题的“ToString()”输出中渲染一个文本区域:

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

从对象中提取数据时这很好用,但是当我尝试发回新数据时,它会以空白的形式返回。

我认为这是因为auto-binder不知道如何处理XElement类型的属性。

有没有办法解决这个问题,或以某种方式自定义自动绑定器的行为,以便正确地反序列化传入的数据?

1 个答案:

答案 0 :(得分:2)

您可以为此编写一个实现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;
    }
}