Как я обращаюсь к постоянному URL в своей конфигурации маршрута?

Предположим, что у меня есть следующее в веб-странице

<% 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. Как я достигаю этого?

1
задан Alex P 13 May 2010 в 10:15
поделиться

2 ответа

Проблема в том, что ваш маршрут имеет значение по умолчанию

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" });
2
ответ дан 3 September 2019 в 00:43
поделиться

Когда вы просматриваете исходный код 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>
<% } %>

}

0
ответ дан 3 September 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: