Passando dados de exibição para controlador
-
10-07-2019 - |
Pergunta
Em uma aplicação ASP.NET MVC, eu estou fazendo a lógica de administrador para aceitar ou rejeitar novos membros. Estou mostrando uma lista de membros e dois botões Aceitar e Rejeitar, como este:
<% foreach (var mm in (ViewData["pendingmembers"] as List<MyMember>)) %>
<% { %>
<tr><td>Username:<%=mm.UserName %></td><td>
<tr><td>Firstname:<%=mm.FirstName %></td><td>
...etc...
<tr>
<td>
<% using (Html.BeginForm("AcceptPendingUser", "Admin"))
{ %>
<input type="submit" value="Accept" />
<% } %>
</td>
<td>
<% using (Html.BeginForm("RejectPendingUser", "Admin"))
{ %>
<input type="submit" value="Reject" />
<% } %>
</td>
</tr>
<% } %>
Assim, a lista de pendente dados dos membros está em uma lista de MyMember-objetos. Cada objeto MyMember será impresso membro e dois botões são configurados para o administrador para aceitar ou rejeitar um membro pendente.
Em seguida, no controlador Eu estou separando o manuseio desses dois campos de entrada / formulários, como este:
public ActionResult AcceptPendingUser()
{
// TODO: Add code to save user into DB and send welcome email.
return RedirectToAction("Index");
}
public ActionResult RejectPendingUser()
{
// TODO: Add code to remove user from PendingUsers list and send rejection email.
return RedirectToAction("Index");
}
Gostaria de obter diretamente o objeto ao lado do botão o usuário pressionou. Como posso enviar o objeto MyMember do Vista para o controlador? Ou como faço para enviar talvez um índice numérico com pressione o botão? Talvez com um campo escondido?
Solução
A opção mais simples seria provavelmente uma entrada escondida:
<input type="hidden" value="<%=mm.Key%>" name="key" id="key" />
(nome conformidade; em cada forma)
O controlador de dois, então, tomar um argumento chamado de "chave" (rename to-suit). Se você quiser analisar o objeto de múltiplas entradas, você precisará de um ModelBinder
. É claro que, em vez de 2 * n formas, você pode considerar qualquer urls base em consulta cordas, ou usar algo como jQuery (ou algum outro ajudante roteiro) para enviar os dados sem a necessidade das formas (se script está disponível).
Outras dicas
Em vez de usar um botão HTML considerar o uso de um ActionLink e construí-lo para incluir o ID do membro a ser aprovado. Outra alternativa seria a de ter uma caixa de seleção (cujo valor é o ID do membro a ser aprovada) que o administrador pode selecionar para cada membro a ser aprovado e um semelhante para rejeitar e um cada aprovar / rejeitar botões para todo o formulário.
Respondendo a mim e outros iniciantes MVC:
Eu tenho que finalmente trabalhar com este código:
VISTA:
<%=Html.ActionLink(
"Jump",
"Jump",
new { name=(ViewData["Person"] as Person).Name,
person=ViewData["Person"]},
null) %>
controlador:
public ActionResult Index()
{
ViewData["Title"] = "Home Page";
ViewData["Message"] = "Welcome to ASP.NET MVC!";
Person p = new Person();
p.Name = "Barrack";
p.Age = 35;
ViewData["Person"] = p;
return View();
}
public ActionResult Jump(string name, Person person)
{
return View();
}
Depuração do aplicativo no método Ir dá-me agradável "Barrack" -string para o parâmetro nome, mas Pessoa parâmetro nulo.
Eu também entendo o que os comentadores tipo tentou explicar:. É fácil para enviar tipos de dados simples como strings e ints para controlador, mas tipos complexos, como meu objeto Pessoa precisa de algo mais
Basicamente passar um int é suficiente para mim. A parte mais difícil aqui foi descobrir o caminho certo para configurar ActionLink.
Cheers, Pom