我有一个“编辑”操作和一个“编辑”视图,允许用户更新数据库中的某个实体。
它的数据库类型是“XML”,DataContext(我使用的是Linq-to-SQL)将其表示为“XElement”类型的属性。
在我看来,我从这个主题的“ToString()”输出中渲染一个文本区域:
<%= Html.TextArea("Text", Model.Text.ToString()) %>
从对象中提取数据时这很好用,但是当我尝试发回新数据时,它会以空白的形式返回。
我认为这是因为auto-binder不知道如何处理XElement类型的属性。
有没有办法解决这个问题,或以某种方式自定义自动绑定器的行为,以便正确地反序列化传入的数据?
答案 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;
}
}