2010-12-06 20 views
23

Deseo publicar algunas preguntas sobre ASP.Net MVC. No estoy familiarizado con el desarrollo web, pero me asignaron la parte web de un proyecto. Estamos haciendo lo siguiente: en primer lugar, creamos get & set propiedades para los datos de la persona:Uso de RedirectToAction en asp.net mvc

public class Person 
{ 
    public int personID {get;set;} 
    public string personName {get;set;} 
    public string nric {get;set;} 
} 

y después de inicio de sesión, ponemos los datos en un objeto de clase Person y usamos RedirectToAction así:

return RedirectToAction("profile","person",new { personID = Person.personID}); 

Funciona normalmente, pero los parámetros se muestran en la URL. ¿Cómo puedo ocultarlos y también puedo ocultar el nombre de la acción? Guíame de la manera correcta con algunos ejemplos, por favor.

+3

Por favor, deje de usar signos de admiración en sus líneas de asunto !!!! –

+4

Deje de usar signos de admiración en general, como comentarios. –

+2

Por favor, elimine la clave que contiene el signo de exclamación de su teclado y anime a los demás a hacerlo para eliminar así esta espantosa plaga de Internet :) – MikeD

Respuesta

34

El parámetro se muestra en la URL porque ese es el tercer parámetro para RedirectToAction: los valores de la ruta.

La ruta por defecto es {controller}/{action}/{id}

lo que este código:

return RedirectToAction("profile","person",new { personID = Person.personID}); 

producirá la siguiente URL/ruta:

/persona/Perfil/123

Si quiere una ruta más limpia, como esta (por ejemplo):

/personas/123

Crear una nueva ruta:

routes.MapRoute("PersonCleanRoute", 
       "people/{id}", 
       new {controller = "Person", action = "Profile"}); 

Y su URL debe estar limpia, al igual que el anterior.

Como alternativa, puede que no le guste usar ID en absoluto, puede utilizar algún otro identificador único, como un apodo.

Así la URL podría ser así:

personas/rpm1984

Para ello, basta con cambiar su ruta:

routes.MapRoute("PersonCleanRoute", 
        "people/{nickname}", 
        new {controller = "Person", action = "Profile"}); 

Y su método de acción:

public ActionResult Profile(string nickname) 
{ 

} 

Y su código de RedirectToAction:

return RedirectToAction("profile","person",new { nickname = Person.nickname}); 

¿Eso es lo que buscas?

+0

entonces, ¿no hay forma de ocultar los parámetros? En realidad no queremos mostrar ningún parámetro en url. :( – Chong

+0

@Chong - por supuesto, puedes ocultar los parámetros, solo depende de la URL. ¿Qué URL quieres * entonces? Dame un ejemplo de URL. – RPM1984

+0

si no quieres ningún parámetro, simplemente haz 'return RedirectToAction ("perfil", "persona"); 'Pero eso producirá'/persona/perfil' que realmente no tiene sentido como URL, por lo que le pido que me dé un ejemplo de la URL que desea. – RPM1984

8

Si no desea que se muestre el parámetro en la barra de direcciones, deberá mantenerlo en algún lugar del servidor entre las redirecciones. Un buen lugar para lograr esto es TempData.He aquí un ejemplo:

public ActionResult Index() 
{ 
    TempData["nickname"] = Person.nickname; 
    return RedirectToAction("profile", "person"); 
} 

Y ahora en la acción perfil está redirigiendo a buscarla a TempData:

public ActionResult Profile() 
{ 
    var nickname = TempData["nickname"] as string; 
    if (nickname == null) 
    { 
     // nickname was not found in TempData. 
     // this usually means that the user directly 
     // navigated to /person/profile without passing 
     // through the other action which would store 
     // the nickname in TempData 
     throw new HttpException(404); 
    } 
    return View(); 
} 

Debajo de las sábanas TempData utiliza Session para el almacenamiento pero será desalojado de forma automática después de la redirección , por lo que el valor podría usarse solo una vez, que es lo que necesita: almacenar, redirigir, recuperar.

+0

Es cierto, podría usar esto. Pero, ¿realmente deseaba serializar/deserializar (suponiendo que la sesión de Proc fuera de sesión) en una sola redirección? Si usa formularios auth, puede recuperar la información del usuario del ticket de todos modos. – RPM1984

+0

gracias por todas sus respuestas, mi pregunta es TempData después de actualizar la página y recibí un error. ¿Cómo puedo manejar esto? – Chong

+1

@Chong use Session. –

1

esto puede ser la solución del problema cuando TempData desaparecido después de actualizar la página: -

cuando por primera vez se obtiene TempData en el método de acción puso en un cheque de escritura ViewData & de la siguiente manera:

public ActionResult Index() 
{ 
    TempData["nickname"] = Person.nickname; 
    return RedirectToAction("profile", "person"); 
} 

ahora en la acción Perfil:

public ActionResult Profile() 
{ 
    var nickname = TempData["nickname"] as string; 

if(nickname !=null) 
ViewData["nickname"]=nickname ; 

if (nickname == null && ViewData["nickname"]==null) 
    { 
    throw new HttpException(404); 
    } 
else 
{ 
if(nickname == null) 
nickname=ViewData["nickname"]; 
} 
    return View(); 
} 
Cuestiones relacionadas