Предположим, что у меня есть следующее в веб-странице
<% using (Html.BeginForm("ShowData", "Summary")) %>
<% { %>
<div class="dropdown"><%=Html.DropDownList("CourseSelection", Model.CourseList, new { @class = "dropdown", onchange="this.form.submit();" })%> </div>
<% } %>
Когда пользователь делает выбор от выпадающего, форма отправлена, и я хотел бы, чтобы она связалась с другой страницей с URL следующим образом:
http://localhost:1721/Summary
У меня есть следующие маршруты:
routes.MapRoute(null, "Summary", new { controller = "Summary", action = "ShowData", CourseSelection = (string) null });
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Login", action = "Index", id = UrlParameter.Optional });
Когда пользователь выбирает объект в dropdownlist, возвращенный URL:
http://localhost:1721/Summary/ShowData?CourseSelection = UserSelection
Очевидно первый маршрут в списке не подбирается.
Я не хочу, чтобы URL показал имя действия и параметр. Я просто хочу показать "Сводку", которая является тем, что я трудно кодировал в URL. Как я достигаю этого?
Проблема в том, что ваш маршрут имеет значение по умолчанию
CourseSelection = (string) null
, которое не является частью URL-адреса маршрута (также известного как «Сводка»).
Существует особая логика при создании URL-адреса, в котором любые значения по умолчанию для маршрута, где параметр , а не в URL-адресе, параметр, который вы указываете, должен соответствовать значениям по умолчанию.
Другой способ исправить это:
using (Html.BeginForm("ShowData", "Summary",
new {CourseSelection = (string)null})) {
...
}
Однако, поскольку вы публикуете это значение в действии, я не понимаю, почему у вас есть CourseSelection по умолчанию в вашем маршруте. Он нужен вам просто как параметр метода действия, и он автоматически привязывается, когда он находится в опубликованных данных формы.
Альтернативное решение - изменить маршрут следующим образом:
routes.MapRoute(null, "Summary",
new { controller = "Summary", action = "ShowData" });
Когда вы просматриваете исходный код html для этого,
<% using (Html.BeginForm("UpdateView", "MyController")) %>
<% { %>
<div class="dropdown"><%=Html.DropDownList("Selection", Model.List, new { onchange="this.form.submit();" })%></div>
<% } %>
вы заметите, что действие пусто . Это связано с тем, что помощник не может найти маршрут на основе того, что вы указали в BeginForm.
Согласно вашему определению в Global.asax, все запросы по умолчанию будут использовать метод действия Index. Вместо этого вы хотите:
routes.MapRoute("Default", "{controller}/{action}", new { controller = "Home", action = "Index" });
Обратите внимание на добавление действия в шаблоне URL.
Это работает для меня.
Global.asax
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(null, "Summary", new { controller = "Summary", action = "ShowData", CourseSelection = (string)null });
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Login", action = "Index", id = UrlParameter.Optional });
}
SummaryController
открытый класс SummaryController: Controller { // // GET: / Summary /
public ActionResult Index()
{
return View();
}
public ActionResult ShowData(string CourseSelection)
{
return View();
}
Код по умолчанию view
<%
var list = new List<string> { "a", "b", "c" };
var selList = new SelectList(list); %>
<% using (Html.BeginForm("ShowData", "Summary")) %>
<% { %>
<div class="dropdown">
<%=Html.DropDownList("CourseSelection", selList, new { @class = "dropdown", onchange="this.form.submit();" })%>
</div>
<% } %>
}