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?

Foi útil?

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

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