route net mvc maproute httpget examples attribute asp c# asp.net-mvc forms routing asp.net-mvc-routing

c# - net - mvc Html.BeginForm esquema de URL diferente



route() in mvc (2)

Estoy creando un formulario para DropDown como este:

@{ Html.BeginForm("View", "Stations", FormMethod.Get); } @Html.DropDownList("id", new SelectList(ViewBag.Stations, "Id", "Name"), new { onchange = "this.form.submit();" }) @{ Html.EndForm(); }

Si elijo un valor de mi lista desplegable, me redireccionan al controlador correcto, pero la URL no es la que me gustaría tener:

/ Estaciones / Ver? Id = f2cecc62-7c8c-498d-b6b6-60d48a862c1c

Lo que quiero es:

/ Estaciones / Ver / f2cecc62-7c8c-498d-b6b6-60d48a862c1c

Entonces, ¿cómo puedo reemplazar el parámetro id = querystring por el esquema de URL más simple que quiero?


Eliminar " id " de

@Html.DropDownList("id", new SelectList(ViewBag.Stations, "Id", "Name"), new { onchange = "this.form.submit();" })


Un formulario con FormMethod.Get siempre publicará los valores de sus controles de formulario como valores de cadena de consulta. Un navegador no puede generar una url en función de las configuraciones de ruta porque son códigos del lado del servidor.

Si realmente desea generar /Stations/View/f2cecc62-7c8c-498d-b6b6-60d48a862c1c , entonces puede usar javascript / jquery para construir su propia url y redirigir

@using (Html.BeginForm("View", "Stations", FormMethod.Get)) { @Html.DropDownList("id", new SelectList(ViewBag.Stations, "Id", "Name")) } var baseUrl = ''@Url.Action("View", "Stations")''; $(''#id'').change(function() { location.href = baseUrl + ''/'' $(this).val(); });

Nota al .change() : presentar en el evento .change() no es el comportamiento esperado y es confuso para un usuario. Recomendamos que agregue un botón para permitir al usuario hacer su selección, verificarlo y luego enviar el formulario (manejar el evento .click() del botón en lugar del evento .click() la lista desplegable)