У меня есть странная проблема с некоторой маршрутизацией в MVC. Вот мой сценарий:MVC странное поведение маршрутизации
- Пользователь получает превью на первую страницу, после посещения сайта:
testproject.com:57416/Home
. - У пользователя есть меню слева, с пунктом меню «Решения».
- Пользователь нажимает пункт меню «Решения», и элемент меню расширяется, показывая 5 подпунктов.
- Пользователь нажимает на подменю пункт «Demo», и перенаправляет на
testproject.com:57416/Solutions/SetLayout?layoutString=page1%7Csize15
- Как Парам
layoutString
определяется, сетка (DevExpress) знают, как фильтровать данные, чтобы показать. - Сетка представлена пользователю, и теперь он может перемещаться по сетке, манипулируя макетом.
- Пользователь теперь хочет снова увидеть чистую демонстрационную схему, и (а) он нажимает на пункт меню «Решения» -> подпункт «Демо-версия».
- Действие
ActionResult SetLayout(string layoutString)
не попал в этом случае, но вместо того, чтобы действиеActionResult Index()
ударил, таким образом, не устанавливая макет какlayoutString
не передается как парам - URL-адрес, который пользователь перенаправляется, выглядит это:
testproejct.com:57416/Solutions?undefined=undefined
Это может быть немного утомительным, чтобы прочитать, но это как можно лучше для меня, чтобы объяснить мой сценарий, я никогда ничего не видел, как это раньше в MVC. Я действительно не знаю, что происходит, и почему действие ActionResult SetLayout(string layoutString)
не попадает во второй раз.
Предполагаю, что я должен показать код, чтобы мы могли сузить возможности.
_Layout.cshtml (имеет пункты меню)
<li class="has-submenu">
<a href ="#" class="navigation-submenu-toggler show-solution-views">Solutions</a>
<ul class="nav sub-menu-list">
<li>
@Html.ActionLink("Demos", "SetLayout", "Solutions", new { layoutString = "page1|size15" }, null)
</li>
</ul>
</li>
ActionResult SetLayout (строка layoutString)
public ActionResult SetLayout(string layoutString)
{
Session["Layout"] = layoutString;
return RedirectToAction("Index", "Solutions");
}
ActionResult Index()
public ActionResult Index()
{
using(var db = new DataBasecontext())
{
var list = db.Solutions.ToList();
return View(list);
}
}
EDIT
Я обнаружил, что это происходит только тогда, когда я внутри того же контроллера. Контроллер, удерживающий действие ActionResult SetLayout(string layoutString)
, является SolutionsController
. Если я приду, скажем, AccountController
все работает нормально, но изменение с SolutionsController
на другое действие в SolutionsController
не работает.
Подумайте об этом, возможно, что-то связано с моими картами маршрутов?
routes.MapRoute(
name: "ControllerIdActionId",
url: "{controller}/{id}/{action}/{id2}",
default : new { id2 = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
default : new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Solutions",
url: "{controller}/{id}/{action}",
default : new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
@ Иногда Код уже есть, просто забыл положить его. Исправлено – Detilium
Взгляните на [Почему наметить специальные маршруты перед общими маршрутами в asp.net mvc] (http://stackoverflow.com/a/35674633/181087) по этой причине и список возможных способов его устранения , Достаточно сказать, что ваша маршрутизация неверна. «RouteLink» является обходным решением (а не решением) проблемы, потому что входящие запросы не соответствуют маршруту, на который вы намеревались, и у вас есть недостижимые пути выполнения в таблице маршрутов. – NightOwl888