2010-09-24 2 views
0

У меня есть URL-адрес, что я хочу карту маршрутизации:Asp.net Routing - Маршрутные ограничения и пустой Маршрут

http://siteurl.com/member/edit.aspx?tab=tabvalue 

где tabvalue является одним из: «личный», «профессионал», «ценности» или ничего.

Я хочу, чтобы отобразить его на маршруте, как:

Member/Edit/{tab} 

Но моя проблема - я не знаю, как определить такие ограничения. Я пытаюсь это регулярное выражение:

^[personal|professional|values]{0,1}$ 

, но она работает только тогда, когда я использую URL-адрес

http://siteurl.com/member/edit/personal 

-или-

http://siteurl.com/member/edit/professional 

и не работает для

http://siteurl.com/member/edit/ 

Любые идеи о том, как указать правильное ограничение?

P.S. Я не использую MVC, просто asp.net WebForms

Спасибо!

+1

Почему '{0,1}', а не только '?'? – configurator

ответ

2

[ ] для набора символов.

использование () вместо

^(personal|professional|values){0,1}$

+0

Это работает! Спасибо, ты получаешь щедрость :) – Andrey

0

попробуйте указать значение по умолчанию UrlParameter.Optional в объявлении маршрута для вкладки.

пс. она должна работать, но, возможно, вы должны сделать выше явно

+0

Я не использую MVC – Andrey

0

Попробуйте это:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapPageRoute("", 
     "Member/Edit/{tab}", 
     "~/member/edit.aspx", 
     true, 
     new RouteValueDictionary 
      {{"tab", ""}}, 
     new RouteValueDictionary 
      {{"tab", "^[personal|professional|values]{0,1}$"}} 
     ); 
} 
+0

Я уже пробовал это, как я упомянул наверху - он не работает – Andrey

+0

Можете ли вы попробовать и удалить ограничение регулярного выражения, чтобы увидеть, работает ли маршрутизация вообще? Если это не так, что это не регулярное выражение, вызывающее проблему, а тот факт, что обработчик маршрутизации не обрабатывает «пустые строки запроса» таким образом. – ntziolis

+0

Работа с общей маршрутизацией, я использую ее для этого URL без ограничений прямо сейчас, а по умолчанию - «личный», если это не одно из указанных выше. Но я хотел бы ограничить URL-адрес ни одной вкладкой или только из этого списка, и что я не могу понять. – Andrey

1

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

public enum TabValue 
{ 
    Personal, 
    Professional, 
    Values, 
} 

... и определить свое действие как ...

public ActionResult Edit(TabValue? tabvalue) 
{ 
    return View("Index"); 
} 

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

... все поставить значение для tabvalue (и оболочка здесь не импорт), где, как эти адреса ..

... ударился действие с tabvalue нуля. Для выполнения этой работы не требуется специальной маршрутизации.

+1

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

+3

Вы правы - я это сделал. Сожалею. Вы должны - это здорово! –

0

Я использовал один каркас раньше, чтобы сделать это. Я не уверен, если вы хотите использовать рамки или, если вы используете один уже, но проверить это:

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

Я использовал его на веб-сайте, это относительно легко настроить - все правила указаны в файле web.config, и у вас есть определенная свобода в разработке ваших маршрутов.

Надеется, что это помогает

0

Рассмотрим с 3 (или 4) маршрутов. Если значение {tab} не является динамическим во время выполнения, наличие 3 статических маршрутов более чистое, чем регулярное выражение. Регулярное выражение обычно полезно только тогда, когда во время выполнения существует множество значений, таких как совпадение числа, даты и т. Д.

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