Passando dados do controlador para um usuário de controle de vista com ASP.NET MVC

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma classe View (OrderView.aspx) que mostra os detalhes de uma ordem (nome da conta, ordem de data), bem como uma lista de linhas de pedido por meio do controle Repeater. Cada linha do pedido é representado por um usuário View Control (OrderLineView.ascx), que mostra os detalhes da linha de pedido (Nome do item, quantidade, preço). Eu tenho um objeto modelo chamado Ordem que eu uso como fonte de dados para tudo isso, o que eu passar como o objeto do modelo para a vista.

Cada controle de usuário OrderLineView tem um Salvar e um botão Delete. Eu tenho o botão Salvar a postar o conteúdo de um formulário dentro do controle OrderLine a um método Save no controlador e, em seguida, RedirectToAction volta para a mesma página Ordem (Isso atualiza a página inteira, nada AJAXy sobre isso). Eu tenho o botão Excluir ligando para um método no controlador que tenta excluir, e depois de volta RedirectToAction à mesma página Ordem. Se a exclusão falhar, no entanto, eu quero um pouco de mensagem de erro para aparecer ao lado do botão apagar quando a página é processada novamente (lembre-se, há um botão excluir para cada linha de pedido na página, então eu só quero a mensagem ao lado o que eu clicado). Minhas perguntas:

1 - Como faço para passar esses dados do meu método controlador para o específico User Control? Deve de alguma maneira eu adicioná-lo para o modelo? Parece ser uma má idéia (já que ele realmente não é parte do modelo).

2 - Devo ter um OrderLineController para as operações OrderLine, bem como um OrderController para operações de ordem? Eu só quero saber se a melhor prática é ter um controlador separado para cada vista.

3 - Eu vi como algumas pessoas podem chamar RedirectToAction com um valor de tipo anônimo como esta:

RedirectToAction("ViewOrder", new { Id = 1234, Message = "blabla"});

mas isso faz com que o valor mensagem aparecer na seqüência de URL. Estou bem com isso, mas preferiria que ele não mostra se possível.

4 - Além disso, para acessar propriedades do Modelo de dentro da vista, eu me vejo fazendo isso o tempo todo:

foo(((someModelType) this.ViewData.Model).SomeProperty);

Eu não fazer assim por um número de razões, uma das quais é o fato de que eu não quero que meu ponto de vista para ser acoplado com o tipo de meu modelo (que é por isso que eu estou usando ViewPage vez de ViewPage) . Eu prefiro muito mais para ser capaz de ter uma chamada como esta:

foo(ModelEval("SomeProperty"));

Existe uma coisa dessas? Eu escrevi o meu próprio, mas gostaria que se eu não preciso.

Foi útil?

Solução

1

Confira ModelState.

ViewData.ModelState.AddModelError("something.Name", "Please enter a valid Name");

ModelState é na verdade um dicionário, para que você possa identificar os erros em uma base per-controle. Eu não sei se isso é uma boa prática, mas provavelmente iria funcionar. Tente algo ao longo das linhas

ViewData.ModelState.AddModelError("something#3.Name", "Please enter a valid Name");

e em sua opinião, você poderia colocar

<%= Html.ValidationMessage(string.format({"something{0}.Name", YourUniqueId))%>

4

Você pode digitar fortemente sua opinião, para que você não precisa que o elenco, mas se você está preocupado com o acoplamento com força, isso pode levá-lo. Mas ter o tipo forte não há mais fortemente acoplados do que ter um ponto de corda mágica para que a propriedade do modelo de qualquer maneira. O ex-dá-lhe apenas digitar a segurança e a glória que é intellisense.

Outras dicas

Desde a sua OrderLine tem um ID único que você pode usar isso para construir uma chave para ser colocado no recipiente erros ModelState.

public ActionResult Delete(int? Id)
{
    ModelState.AddModelError("OrderLine" + Id.Value, "Error deleting OrderLine# " + Id.Value);

    ...    
}

e, em seguida, usar o ajudante ValidatinoMessage. Este irá verificar o ModelState para ver se existe um erro e se isso acontecer ele irá exibir a mensagem. Caso contrário, é em branco.

<%= Html.ValidationMessage ("OrderLine" + Id)%>

Na próxima versão do MVC Modelo vai se tornar uma propriedade de nível superior, para o seguinte

foo(((someModelType) this.ViewData.Model).SomeProperty);

pode ser escrita como

foo(Model.SomeProperty);

Modelo objetos já deve ser digitado a menos que você estiver usando objeto pública como uma propriedade?

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