2009-01-02 21 views
9

Tengo una aplicación donde necesito que el usuario pueda actualizar o eliminar filas de datos de la base de datos. Las filas se muestran al usuario mediante un bucle foreach en el archivo .aspx de mi vista. Cada fila tendrá dos campos de texto (txtName, txtDesc), un botón de actualización y un botón de eliminar. De lo que no estoy seguro es de cómo tengo el botón de actualización para enviar el mensaje al controlador ¿para qué fila actualizar? Puedo ver una manera par de hacer esto:Asignación de botones individuales en ASP.NET MVC Vista para las acciones del controlador

  1. puso cada fila dentro de su propia forma de etiqueta, a continuación, cuando se hace clic en el botón de actualización, que presentará los valores de esa fila única (también habrá un campo oculto con rowId) y la clase de controlador tomaría todos los valores de publicación como parámetros para el método de actualización en el controlador.
  2. De alguna manera, haga que el botón se escriba de una manera para enviar solo los valores de esa fila con una POST al controlador.

¿Hay alguna manera de hacerlo? Una cosa que me preocupa es si cada fila tiene diferentes nombres para sus controles asignados por ASP.NET (txtName1, txtDesc1, txtName2, txtDesc2), entonces ¿cómo se asignarán sus valores a los parámetros correctos del método del controlador?

+0

Si usa la etiqueta del botón en lugar de la entrada, puede establecer el valor y el texto de la pantalla por separado, luego verifique el valor en el controlador. –

Respuesta

11

Puede utilizar varias formas, y establezca la acción en la forma de ser de esta manera:

<form method="post" action="/YourController/YourAction/<%=rowId%>"> 

por lo que tendrá YourController/YourAction/1, YourController/YourAction/2 y así sucesivamente.

No hay necesidad de dar diferentes nombres a los diferentes cuadros de texto, solo llámalos txtName, txtDesc, etc. (o mejor aún, deshazte de esos prefijos txt). Como están en diferentes formas, no se mezclarán.

Luego de la acción que hacer algo como

public ActionResult YourAction(int id, string username, string description) 

Donde nombre de usuario, la descripción son los mismos nombres que ha utilizado en los controles de formulario (por lo que se asignan automáticamente). El parámetro id se asignará automáticamente al número que coloque en la acción del formulario.

+0

Esta respuesta es correcta. Yo agregaría que, mientras que los nombres de elementos pueden y deben ser repetidos para cada formulario, cada elemento debe tener una ID única. –

+0

Si estoy usando un control de usuario de ASP.NET para cada fila, y en el control estoy usando cuadros de texto y botones de ASP.NET, ¿es posible hacer todo el nombre repetido, identificación única? – skb

+0

O también puede crear un botón html simple y obtener su valor en el método de publicación del controlador: http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons- in-the-same-form.aspx –

0

Como rodbv dijo que desea utilizar elementos <form> separados.

Cuando usa Asp.Net MVC o html clásico (php, asp clásico, etc.), debe olvidarse de la manera en que Asp.Net maneja las pulsaciones de los botones. Cuando un formulario se publica en el servidor web, todo lo que sabe el servidor es simplemente "el formulario se envió y contenía los siguientes elementos de entrada".

Asp.net (estándar) agrega un envoltorio alrededor de muchas de las acciones estándar de postback html usando javascript (la función __doPostback javascript se usa en casi todas partes) y esto agrega información sobre qué elemento de entrada del formulario causó la devolución y lo entrega al servidor en una variable de forma oculta. Podrías imitar este comportamiento si realmente lo deseas, pero recomendaría no hacerlo.

Puede parecer extraño "tirar basura" a una página con muchos <form>, sin embargo, significará que la devolución del servidor será más liviana y hará que todo se ejecute un poco más rápido para el usuario.

4

También puede tener varios botones de "válidos" nombrados en la forma como:

<input type="submit" value="Save" name="btnSave" id="btnSave"/> 
<input type="submit" value="Delete" name="btnDelete" id="btnDelete"/

y de comprobar para ver lo envía que ha recibido. No puede haber una sola acción de enviar enviado por la forma, por lo que es como todos los demás botones presentar en realidad no existían en el primer lugar:

if (HttpContext.Request.Form["btnDelete"] != null) { 
    //Delete stuff 
} elseif (HttpContext.Request.Form["btnSave"] != null) { 
    //Update stuff 
} 

También creo que se puede implementar un ActionMethodSelectorAttribute encargo como aquí http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx (también mencionado anteriormente) para tener un código separado más limpio.

Cuestiones relacionadas