Como passar um objeto modificado unpersisted de vista de volta ao controlador sem um formulário?

StackOverflow https://stackoverflow.com/questions/295200

  •  08-07-2019
  •  | 
  •  

Pergunta

Curto:? como é que ModelBinding passar objetos da vista para o controlador

Long:
Primeiro, com base nos parâmetros fornecidos pelo usuário através de um formulário de pesquisa, alguns objetos são recuperados do banco de dados. Esses objetos são dadas meta dados que são visíveis (mas não definir) para o cliente. (Por exemplo: nomear e preços dos objetos diferem de região para região)
Mais tarde, no site, o usuário pode clicar em links que devem mostrar detalhes desses objetos. Porque estes meta-dados são importantes para a exibição, mas não definir, eu preciso para obter a parte de trás objeto previamente alterado no controlador. Quando eu uso o padrão asp.net MVC ModelBinding, o método .ToString () é usado. Este fora do curso não retornar uma string relevantes para recriar o objeto completo.
Eu teria imaginado a interface ISerializable seria envolvido, mas isso não é assim. Como devo proceder para obter o efeito desejado? Eu não posso imaginar que eu sou o primeiro a ser confrontados com esta pergunta, então eu acho que eu estou faltando alguma coisa em algum lugar ...

Foi útil?

Solução

O modelo padrão de ligação leva parâmetros de formulário pelo nome e combina-los com as propriedades do tipo especificado na lista de argumentos. Por exemplo, o modelo tem propriedades "Preço" e "Nome", em seguida, a forma seria necessário para conter entradas com ids / nomes "Preço" e "Nome" (Eu suspeito que ele faz um jogo insensível caso). O ligante utiliza reflexão para converter os valores do formulário associados com estas chaves para o tipo e atribui-o apropriado para as propriedades de um objecto recém-criado do tipo especificado pelo parâmetro (de novo derivado por reflexão).

Você pode realmente olhar para (e download) a fonte para este em http://www.codeplex.com / aspnet , embora você terá que detalhar a fonte MVC de lá. Eu daria um link para a fonte DefaultModelBinder, mas a forma como eles são construídos, acredito que o link mudanças como as revisões são introduzidos.

Assim, para responder sua pergunta, você precisa ter parâmetros (poderia ser escondido) no formulário que correspondem às propriedades do objeto que você deseja recriar. Quando é registada a forma (na vista) para o controlador, o ligante deve reconstituir um objecto do tipo especificado usando os parâmetros de formulário. Se você precisa fazer a tradução dos valores do parâmetro de formulário para as propriedades do objeto, você provavelmente vai precisar implementar seu próprio modelo personalizado pasta.

[EDIT] Em resposta ao seu segundo post:

Vamos dizer que nós queremos ter um link para uma ação que usa um objeto personalizado. Podemos armazenar o objeto personalizado em TempData (ou a sessão, se precisar dele para durar mais através de mais de um postback) com uma chave particular. Podemos, então, construir o link de ação e fornecer a chave do objeto como valor para a ActionLink em uma classe anônima. Isso vai passar para trás a chave como um parâmetro de solicitação. Em nossa ação que pode usar a tecla de este parâmetro para recuperar o objeto de TempData.

<%= Html.ActionLink( ViewData["CustomObject1",
                     "Select",
                     new { TempDataKey = ViewData["CustomObject1_Key"] }
                   ) %>
&nbsp;

public ActionResult Select()
{
    Entity custObj = null;
    string objKey = Request.Params["TempDataKey"];
    if (!string.IsNullOrEmpty(objKey))
    {
       custObj = (Entity)TempData[objKey];
    }

    ... continue processing
}

Outras dicas

@tvanfosson

Obrigado por sua explicação, mas que sobre links? (Não há formas envolvido) Atualmente o Html.ActionLink (c => c.Action (parâmetro), "label") toma objetos como parâmetro. Estes têm de ser traduzido em peças de URL. Para isso, MVC sempre vai para o método .ToString (). Eu não quero para serializar meu objeto no método ToString.
Eu não deve ser capaz de ajudar de alguma forma a estrutura serializar meu objeto? Dizer através da interface ISerialize ou algo assim?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top