2012-03-12 14 views
11

que tienen un método de acción que tiene este aspecto:ASP.NET MVC Retire cadena de consulta en el método de acción

public ActionResult Index(string message) 
{ 
    if (message != null) 
    { 
    ViewBag.Message = message; 
    } 
    return View(); 
} 

Lo que pasa es que la URL de la solicitud a esta se verá así:

www.mysite.com/controller/?message=Hello%20world 

Pero yo quiero que se vea simplemente

www.mysite.com/controller/ 

¿hay una manera de quitar la cadena de consulta dentro de la actionmethod?

+0

¿Estás diciendo que quieres un mensaje predeterminado cuando no ingresan una cadena de consulta? ¿O que desea ocultar la cadena de consulta independientemente del tipo de mensaje enviado en la url inicialmente? –

+0

El segundo, básicamente quiero procesar el mensaje (puede ser cualquier cosa) y no mostrarlo en la url. – willvv

Respuesta

15

No, a menos que utilice un método POST, la información debe ser aprobada de alguna manera. Una alternativa puede ser usar una clase intermedia.

// this would work if you went to controller/SetMessage?message=hello%20world 

public ActionResult SetMessage(string message) 
{ 
    ViewBag.Message = message ?? ""; 
    return RedirectToAction("Index"); 
} 

public ActionResult Index() 
{ 
    ViewBag.Message = TempData["message"] != null ? TempData["message"] : ""; 
    return View(); 
} 

Or. si simplemente utilizó un POST

//your view: 
@using(Html.BeginForm()) 
{ 
    @Html.TextBox("message") 
    <input type="submit" value="submit" /> 
} 


[HttpGet] 
public ActionResult Index() 
{ return View(); } 

[HttpPost] 
public ActionResult Index(FormCollection form) 
{ 
    ViewBag.Message = form["message"]; 
    return View(); 
} 
+1

Sí, justo lo que pensaba. Terminé haciendo algo similar: \t \t \t \t si \t \t \t \t { \t \t \t \t \t TempData [ "mensaje"] = mensaje; (mensaje! = Null) \t \t \t \t \t return RedirectToAction ("Índice"); \t \t \t \t} \t \t \t \t si (TempData.ContainsKey ("Message")) \t \t \t \t { \t \t \t \t \t ViewBag.Message = TempData [ "mensaje"]; \t \t \t \t \t TempData.Remove ("Mensaje"); \t \t \t \t}, que básicamente guarda el mensaje y luego vuelve a cargar el mismo método de acción sin parámetros. – willvv

+0

¿Sigue siendo esta la mejor solución? Tengo una página que solo se muestra a ciertas horas, y se necesita un modelo, pero esta acción no es de acceso público y quiero que tenga una URL bonita como/Registration/AfterHours y no/Registration/AfterHours? DateTime ... [ Caracteres locos]. De todos modos, esto funciona. –

2

No estoy seguro de que realmente estés pensando en eso. Si elimina la cadena de consulta ... entonces elimina la cadena de consulta ... es decir, su página no tendrá el valor de cadena de consulta para hacer lo que sea necesario.

Hay muchos hacks diferentes que podrías hacer ... todos ellos no son ideales. Puede usar javascript para eliminar la cadena de consulta. Podría redirigir a una página querystring-less después de establecer una variable de sesión ... todo es bastante feo.

Recuerde que lo que el usuario ve en la barra de direcciones está en el cliente. El cliente controla eso. Puede jugar con él a través de javascript, pero hacerlo generalmente es una mala idea. Dado que esconder cosas del usuario se puede considerar un comportamiento similar al malware.

1

Mire en routes. Definen cómo se escribirá una url con parámetros.

Si crea una nueva aplicación MVC, y mira el archivo Global.asax.cs en `RegisterRoutes(). deberías ver una entrada.

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "home", action = "index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

vistazo a cada parte:

  • "defecto" es el nombre. Esto solo tiene que ser exclusivo para cada ruta que crees.
  • "{controller}/{action}/{id}" es el patrón que desea utilizar. example.org/home/index?id=2 se escribirá example.org/home/index/2 en su lugar
  • nuevo {controller = "home", action = "index", id = UrlParameter.Optional} está definiendo los valores predeterminados si no se especifica nada.

Por lo tanto, esa ruta que sea así que si vas a example.org se asumirá que quiere decir example.org/home/index{id es opcional}.

Trabajando desde ahí, puede comenzar a ver cómo crear sus propias rutas.

Ahora, dirigiéndose a su pregunta, la respuesta corta es sí que podría hacer la URL que parezca, pero no realmente. Tendría que definir una ruta con un mensaje predeterminado, y solo se vería así si alguien no especificara un mensaje. Tienes que decirle al controlador cuál es el mensaje. Lo siento, pero lo mejor que puede hacer es definir una ruta que le proporcione

/message/Hello%20World y una cadena.reemplace para que se vea aún mejor `'/ message/hello_world'

+0

No está tratando de agregar un parámetro amigable, quiere de alguna manera tener un valor de cadena de consulta, pero no mostrarlo en absoluto en la url. –

+0

si lee mi respuesta completa, verá que me dirijo a esa – Joe

0

Recomiendo usar una babosa. Echa un vistazo a esta publicación: SOF Slug post En aplicaciones anteriores, tomé este enfoque para eliminar cadenas de consulta de la URL.

Cuestiones relacionadas