asp.net MVC-маршрут с обнуляемыми значениями - Обновлено 23/2 - UrlParameter.Optional - PullRequest
1 голос
/ 21 февраля 2010

У меня следующий маршрут:

routes.MapRoute(
"Search",
"Search.aspx/l-{lID}/t-{tID}/p-{pID}/s-{sID}",
new { 
    controller = "Search", 
    action = "Search", 
    lID = "",
    tID = "", 
    pID = "", 
    sID = "" },
new { lID = @"\d{0,}", 
    tID = @"\d{0,}", 
    pID = @"\d{0,}", 
    sID = @"\d{0,}" }
);

Что отлично работает, если мой URL равен http://localhost:1234/Search.aspx/l-1/t-1/p-1/s-1, но я хочу, чтобы некоторые из этих параметров были пустыми, поэтому URL может выглядеть следующим образом: http://localhost:1234/Search.aspx/l-/t-/p-1/s- однако, когда это происходит, я получаю 404 ошибки. 1008 *

Кто-нибудь знает, как я могу заставить этот маршрут работать так, чтобы у меня могли быть пустые значения?

Обновление:

Следуя совету, я обновил проект до MVC 2, однако проблема все еще возникает. Мой маршрут теперь выглядит так:

routes.MapRoute(
"Search",
"Search.aspx/l-{lID}/t-{tID}/p-{pID}/s-{sID}",
new
{
   controller = "Search",
   action = "Search",
   lID = UrlParameter.Optional,
   tID = UrlParameter.Optional,
   pID = UrlParameter.Optional,
   sID = UrlParameter.Optional
},
new
{
   lID = @"\d{0,}",
   tID = @"\d{0,}",
   pID = @"\d{0,}",
   sID = @"\d{0,}" }
);

Я все еще получаю 404, когда пытаюсь просмотреть представление с пустыми значениями в.

Еще одна проблема, возникшая после перехода на версию 2, заключается в том, что RedirectToRoute не может найти маршрут. Я получаю

Ни один маршрут в таблице маршрутов не соответствует заданным значениям.

сообщение об ошибке. Мой код выглядит так:

return RedirectToRoute( 
"Search", 
new { 
    lID = lID, 
    tID = tID,
    pID = pID,
    sID = sID 
    } 
);

Опять же, любая помощь будет высоко ценится.

Спасибо

Ответы [ 3 ]

0 голосов
/ 22 февраля 2010

Немного затянуто, но это должно сработать.

//All params.
routes.MapRoute(
  "Search",
  "Search.aspx/l-{lID}/t-{tID}/p-{pID}/s-{sID}",
  new { 
    controller = "Search", 
    action = "Search", 
    lID = "",
    tID = "", 
    pID = "", 
    sID = ""
  },
  new {
    lID = @"\d{0,}", 
    tID = @"\d{0,}", 
    pID = @"\d{0,}", 
    sID = @"\d{0,}"
  }
);

//First three params
routes.MapRoute(
  "Search",
  "Search.aspx/l-{lID}/t-{tID}/p-{pID}",
  new { 
    controller = "Search", 
    action = "Search", 
    lID = "",
    tID = "", 
    pID = "", 
  },
  new {
    lID = @"\d{0,}", 
    tID = @"\d{0,}", 
    pID = @"\d{0,}", 
  }
);

//First two params
routes.MapRoute(
  "Search",
  "Search.aspx/l-{lID}/t-{tID}",
  new { 
    controller = "Search", 
    action = "Search", 
    lID = "",
    tID = "", 
  },
  new {
    lID = @"\d{0,}", 
    tID = @"\d{0,}", 
  }
);

//First param
routes.MapRoute(
  "Search",
  "Search.aspx/l-{lID}",
  new { 
    controller = "Search", 
    action = "Search", 
    lID = "",
  },
  new {
    lID = @"\d{0,}", 
  }
);

//No params.
routes.MapRoute(
  "Search",
  "Search.aspx",
  new { 
    controller = "Search", 
    action = "Search", 
  }
);

Я должен отметить, что он, вероятно, должен быть в том порядке, учитывая, что ASP.NET MVC ленив в отношении маршрутов и прибудет к первому найденному маршруту, который соответствует. Тем не менее, вам, вероятно, следует взглянуть на установку ограничений для идентификаторов на @"\d{1,}", так как они, вероятно, будут срабатывать постоянно ...

0 голосов
/ 23 февраля 2010

После просмотра обоих UrlParameter.Optional и создания фильтра действий, как описано здесь Я все еще не мог заставить работать ни с пустыми значениями.

В конце я передаю ноль действию и проверяю, равен ли он нулю, затем обнуляю значение. Не идеальная ситуация, но она работает и будет работать, пока я не найду что-нибудь получше.

0 голосов
/ 21 февраля 2010

Дополнительные параметры URL доступны как часть MVC2 - Ознакомьтесь с публикацией Фила Хаака, объясняющей его . Это было добавлено в MVC 2 RC 2.

Что еще нужно отметить, MVC2 не потребует .Net 4 , он также будет работать на 3.5. Это означает, что если вы можете немного подождать, вы можете перейти на MVC2 без полного обновления 4.0 и получить эту функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...