Controle de usuário Asp.net MVC ViewData
-
09-06-2019 - |
Pergunta
Quando um controlador renderiza uma visualização baseada em um modelo, você pode obter as propriedades da coleção ViewData usando o indexador (ou seja,ViewData["Propriedade"]).No entanto, tenho um controle de usuário compartilhado que tentei chamar usando o seguinte:
return View("Message", new { DisplayMessage = "This is a test" });
e no meu controle de mensagens eu tinha isso:
<%= ViewData["DisplayMessage"] %>
Eu acho que isso renderizaria DisplayMessage corretamente, no entanto, null está sendo retornado.Depois de uma grande dose de ajustes, finalmente criei uma classe "MessageData" para digitar fortemente meu controle de usuário:
public class MessageControl : ViewUserControl<MessageData>
e agora esta chamada funciona:
return View("Message", new MessageData() { DisplayMessage = "This is a test" });
e pode ser exibido assim:
<%= ViewData.Model.DisplayMessage %>
Por que a propriedade DisplayMessage não seria adicionada ao ViewData (ou seja,coleção ViewData["DisplayMessage"]) sem digitação forte no controle do usuário?Isso é intencional?Não faria sentido que ViewData contivesse uma chave para “DisplayMessage”?
Solução
O método
ViewData.Eval("DisplayMessage")
deve funcionar para você.
Outras dicas
É claro que depois de criar esta pergunta, encontro imediatamente a resposta após mais algumas pesquisas no Google
http://forums.asp.net/t/1197059.aspx
Aparentemente, isso acontece por causa da classe wrapper.Mesmo assim, parece que qualquer propriedade passada deve ser adicionada à coleção ViewData por padrão.
Eu realmente preciso parar de responder minhas próprias perguntas :(