Pregunta

Tengo un problema con un enrutamiento de muestra con la vista previa 5 de asp.net mvc.

En AccountController tengo 2 acciones:

public ActionResult Delete()  
public ActionResult Delete(string username)

Al intentar buscar Cuenta/Eliminar o Cuenta/Eliminar?nombre de usuario=davide, ControllerActionInvoker genera una excepción que dice que la solicitud de eliminación es ambigua entre mis métodos de acciones de remolque.

La ruta predeterminada en global.asax no se ha cambiado.

¿No debería entender el invocador de la acción cuál es el método a llamar buscando en la lista de parámetros?

Usando la vista previa 4 no tuve este tipo de problemas al realizar la misma operación.

¿Alguna idea?

¿Fue útil?

Solución

¡Solución encontrada!

Con la introducción de ActionNameAttribute, ahora es necesario filtrar manualmente qué método llamar según la solicitud.Esto lo hace ActionSelectionAttribute.

Explicación completa aquí: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

Otros consejos

No puedo decir con certeza por qué sucede esto.Pero es posible que desee considerar tener solo la acción Eliminar (nombre de usuario de cadena) y eliminar la sobrecarga sin parámetros.

Debido a que la cadena admite valores NULL, entiendo que simplemente llamar a Cuenta/Eliminar invocará la acción con un parámetro de nombre de usuario nulo que luego puede probar al comienzo del método de acción.

Lo que haría es deshacerme del Eliminar() en blanco y solo usar Eliminar(nombre de usuario de cadena)

¿En el enrutamiento de su URL tendría algo similar a "/{Controller}/{Action}/{username}/"?Si tiene "/{Controller}/{Action}/{Id}/", será mejor que haga Eliminar (id de cadena) y de esa manera simplemente use la URL para manejar este "/Account/Delete/davide/"

Dicho esto, use su ruta predeterminada, que debería ser algo así como el ID predeterminado es ""

Luego, en su método Eliminar (identificación de cadena), tenga:

public ActionResult Delete(string id)
{
    if(string.IsNullOrEmpty(id)) return EmptyID();

    // Continue normal Delete method
}

public ActionResult EmptyID()
{
    // The method you were going to have on a blank delete.
}

Eso o simplemente resumirlo en un método en un if {} else {}

De cualquier manera, simplemente usaría un método y establecería un valor predeterminado en su nombre de usuario/id en su ruta de una cadena vacía y lo manejaría de esa manera.

Si desea ponerse en contacto conmigo para hacer un seguimiento de lo que quiero decir, o cualquier cosa que pueda ayudar, envíeme un ping a andrew@ mi dominio en mi página de información.

Editar:Ah, más o menos lo que dijo Berko de todos modos, no estoy seguro de cómo ayudarían los atributos nombrados, así que publique un comentario aquí detallandolo para otros chicos que encuentren los mismos problemas.:)

Es ambiguo porque las dos acciones del controlador son el mismo método de publicación.Solo puede usarlo en el escenario de publicación de formularios, por ejemplo, si envía datos de un formulario que usa publicación HTTP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top