Pergunta

Eu tenho uma ação "Editar" e uma vista "Editar" para permitir aos usuários atualizar uma determinada entidade no banco de dados.

É do tipo de banco de dados é "XML", ea DataContext (estou usando o Linq-to-SQL) representa-lo como uma propriedade do tipo "XElement".

Em minha opinião, eu processar a-área de texto do "ToString ()" saída do propery assim:

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

Esta multa funciona quando puxando os dados do objeto, mas quando eu tento publicar o novo de volta os dados, ele volta como em branco.

Eu acho que isso é porque a auto-aglutinante não sabe como lidar com uma propriedade do tipo XElement.

Existe uma maneira de corrigir isso, ou de alguma forma personalizar o comportamento do auto-aglutinante para que ele de-serializa os dados recebidos corretamente?

Foi útil?

Solução

Você pode escrever uma pasta feita sob encomenda para este que implementa a IModelBinder interface. Pode registar esta pasta sobre o método em si:

public ActionResult Edit([ModelBinder(typeof(XElementBinder))] XElement element)
{ ... }

ou globalmente para todos XElement está em seu aplicativo por registereing sua pasta em Global.asax:

ModelBinders.Binders[typeof(IPrincipal)] = new PrincipalModelBinder();

A sua pasta feita sob encomenda seria algo parecido com isto:

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;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top