2016-05-27 3 views
0

У меня есть странная проблема с некоторой маршрутизацией в MVC. Вот мой сценарий:MVC странное поведение маршрутизации

  1. Пользователь получает превью на первую страницу, после посещения сайта: testproject.com:57416/Home.
  2. У пользователя есть меню слева, с пунктом меню «Решения».
  3. Пользователь нажимает пункт меню «Решения», и элемент меню расширяется, показывая 5 подпунктов.
  4. Пользователь нажимает на подменю пункт «Demo», и перенаправляет на testproject.com:57416/Solutions/SetLayout?layoutString=page1%7Csize15
  5. Как Парам layoutString определяется, сетка (DevExpress) знают, как фильтровать данные, чтобы показать.
  6. Сетка представлена ​​пользователю, и теперь он может перемещаться по сетке, манипулируя макетом.
  7. Пользователь теперь хочет снова увидеть чистую демонстрационную схему, и (а) он нажимает на пункт меню «Решения» -> подпункт «Демо-версия».
  8. Действие ActionResult SetLayout(string layoutString) не попал в этом случае, но вместо того, чтобы действие ActionResult Index() ударил, таким образом, не устанавливая макет как layoutString не передается как парам
  9. 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 } 
); 
+0

@ Иногда Код уже есть, просто забыл положить его. Исправлено – Detilium

+0

Взгляните на [Почему наметить специальные маршруты перед общими маршрутами в asp.net mvc] (http://stackoverflow.com/a/35674633/181087) по этой причине и список возможных способов его устранения , Достаточно сказать, что ваша маршрутизация неверна. «RouteLink» является обходным решением (а не решением) проблемы, потому что входящие запросы не соответствуют маршруту, на который вы намеревались, и у вас есть недостижимые пути выполнения в таблице маршрутов. – NightOwl888

ответ

0

мне удалось решить эту проблему самостоятельно.

Я не совсем уверен, в чем проблема, но сменив Html.ActionLink() на Html.RouteLink(), я смог определить, что использовать MapRoute.

я решил его с помощью следующей MapRoute

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
) 

я мог бы использовать Html.RouteLink так:

Html.Routelink("Demos",      //Display text 
       "Default",      //The MapRoute to use 
     new { layoutString = "page1|size15|", //The param (layoutString) 
       controller = "Solutions",  //The controller 
       action = "SetLayout" })   //The action 

Я не внес никаких изменений в действии:

public ActionResult SetLayout(string layoutString) 
{ 
    Session["Layout"] = layoutString; 
    return RedirectToAction("Index", "Solutions"); 
} 
0

Кажется, что параметр layoutString имеет значение параметра отсутствует на своем втором обжиге, таким образом, пустое значение строки вставляется в ключ сеанса (и функции Javascript, связанные с этой сессии рассматривать пустую строку как не определено).

public ActionResult SetLayout(String layoutString) 
{ 
    // Test if the string is null or empty before filling session key, 
    // if it is empty one, leave the session key as is 
    if (!String.IsNullOrEmpty(layoutString)) { 
     Session["Layout"] = layoutString; 
    } 
    return RedirectToAction("Index", "Solutions"); 
} 

Возможно, это не самый лучший способ сделать, я просто смотреть с точки зрения методы SetLayout для заполнения ключа сеанса с правильной строкой запроса.

+0

Я понимаю, что решение любых проблем, связанных с 'layoutString' будет пустым. Почему я не понимаю, почему он пуст? – Detilium

0

Pass пятый параметр утративший в вашем ActionLink, как показано ниже:

@Html.ActionLink("Demos", "SetLayout", "Solutions", new { layoutString = "page1|size15" },null) 

Я не проверял, но может быть, это вопрос ..

+0

Я забыл поставить это. У меня уже есть пятый параметр = null. Мои извинения. Исправлено – Detilium

Смежные вопросы