2014-11-18 2 views
1

Я хочу, чтобы URL-адрес из базы данных, как динамически. Для примера: у меня есть,Как динамическое сопоставление url в asp.net с C#?

http://www.example.com/Category.aspx?cid=c001&cname=Men

и я хочу,

http://www.example.com/Men/

+0

Рассматривали ли вы переход к структуре ASP.NET MVC? –

+0

NO. Я использую asp.net 3.5 framework – Boktiar

ответ

0

Это решение является довольно интенсивным, но действительный один все-таки ,

У нас была такая же проблема в моей работе несколько лет назад (до того, как мы перешли на ASP.NET MVC, который я настоятельно рекомендую).

Во-первых, мы создали новый модуль ASP.NET (и зарегистрировали его в IIS или Web.config). Этот модуль получит запросы входящего клиента.

Мы построили наши собственные HttpModule и заставили его работать вдоль файла конфигурации, где мы определили наши действительные маршруты, в вашем случае http://www.example.com/Men/.

У нас был бы список руководители. Эти менеджеры будут работать как конвейер. Каждый менеджер получит результат предыдущего.

Следуя этому подходу, наш первый менеджер был наш RewriteManager, который обработал переписывание URL входящего запроса, так что будущие менеджеры (и унаследованные из них) могли бы продолжать с помощью нашего Aspx URL.

Вот пример одного нашего маршрута в конфигурационном файле нашего модуля:

<configuration name="note" 
       mode="1" 
       urlPattern="^https?://(([a-z0-9\-]*\.)?localhost(:[0-9]+)?/((?'note_id'[0-9]+)-?(?'title'.*))$" 
       rewriteUrl="/note.aspx?note_id={note_id}&amp;site={ContextInfo.site}"> 

    <manager type="LaNacion.Framework.Web.Managers.RewriteManager, LaNacion.Framework.Web.Managers"/> 

    <!-- THESE MANAGERS NEED THE ASPX URL, THEY ARE LEGACY MANAGERS --> 
    <manager type="LaNacion.Framework.Web.Managers.FileCacheManager, LaNacion.Framework.Web.Managers"/> 
    <manager type="LaNacion.Hola.Web.Managers.NotaManager, LaNacion.Hola.Web.Managers"/> 
    <manager type="LaNacion.Framework.Web.Managers.OutputImageCacheManager, LaNacion.Framework.Web.Managers"/> 

</configuration> 

Как вы можете видеть, мы определяем наш маршрут в регулярном выражении и вспомнить необходимую информацию с помощью именованных групп по регулярному выражению. Позже мы построим наш устаревший URL, используя эту информацию, которую мы вспомнили.

В вас случае атрибут urlPattern будет выглядеть следующим образом:

https?://(([a-z0-9\-]*\.)?localhost(:[0-9]+)?/(?'entity'[a-zA-Z]+) 

И атрибут rewriteUrl wourld быть:

/Category.aspx?cid=c001&cname={entity} 

Мы делаем переписывания URL, используя RewritePath метод из HttpContext пример:

System.Web.HttpContext.Current.RewritePath(newUrl); 

Будущие менеджеры затем смогут извлекать параметры запроса, как они всегда делали, что делает устаревшие менеджеры такими же, как и раньше.

Надеюсь, я сделал себе достаточно ясно, и это помогло вам.

0

Решение, описанное выше, Мати-Цицеро хорошо работает, если вы уже знаете свои правила перезаписи. Если вы хотите пойти этим путем, я бы также предложил статью в http://weblogs.asp.net/scottgu/tip-trick-url-rewriting-with-asp-net (старый, но хороший).

Но если вы хотите, чтобы переписать URL-адресов, хранящихся в базе данных, это то, что я предлагаю:

Создать HttpModule таким образом:

public class DBRewriteModule : IHttpModule 
{ 
    public DBRewriteModule() 
    { 

    } 

    public void Init(HttpApplication context) 
    { 
     context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest); 
    } 

    void context_AuthorizeRequest(object sender, EventArgs e) 
    { 
     Rewriter rw = new Rewriter(); 
     rw.Process(); 
    } 
} 

Добавить его в свой файл web.config так:

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="DBRewrite" type="smartdev.web.Modules.DBRewriteModule" /> 
    </modules> 
</system.webServer> 

И в вашем Rewriter CS файл, который вы должны ч ave что-то похожее на:

public class Rewriter 
{ 
    public Rewriter() 
    { 
    } 

    public bool Process() 
    { 
     // get path from database based on your original path: 
     // use HttpContext.Current.Request.Path and HttpContext.Current.Request.QueryString 
     string substPath = "...your db logic here ..."; 
     HttpContext.Current.RewritePath(substPath); 
    } 
} 
Смежные вопросы