Url Routing در ASP.Net WebForms
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

داشتن Url‌های تمیز و با معنا یکی از ویژگی‌های یک سایت خوب هست و بهترین روش برای بازنویسی URL‌ها یا همان Url Routing، استفاده از امکانات توکار خود ASP.Net برای این کار است. در یک مثال کوچک برای WebForm‌ها این کار را بررسی خواهیم کرد.
ابتدا باید فضای نام  System.Web.Routing را در فایل Global.asax اضافه کنیم .
سپس توسط RouteTable.Routes.MapPageRoute  در Application_Start میتوانیم الگو‌های تبدیل Url‌های خود را بنویسیم.
protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.MapPageRoute("Product", "Product/{Name}", "~/Product.aspx");
        }
تابع RouteTable.Routes.MapPageRoute  سه ورودی می‌گیرد.  ورودی اول یک نام برای الگوی تبدیل ماست که در مثال بالا، "Product" نام گرفته است. ورودی دوم، الگوی تبدیل ماست که می‌گوید Url هایی به شکل {Product/{Name را به صفحه‌ی Product.aspx بفرست و در صفحه‌ی Product.aspx میتوانیم مقدار {Name} را توسط ["Page.RouteData.Values["Name بدست بیاوریم . ورودی سوم نیز صفحه‌ی مقصد می‌باشد.
با این الگو میتوانیم لینک هایی مثل "لبتاب/Product" ایجاد کنیم و در صفحه‌ای که میخواهیم اطلاعات محصولمان را نشان دهیم از ["Page.RouteData.Values["Name که همان مقدار لبتاب را بر میگرداند، استفاده کنیم.
یک مثال واقعی‌تر؛ مثالی که در URL‌های مقالات همین سایت هم از آن استفاده شده البته از نوع MVC .
RouteTable.Routes.MapPageRoute("PostDetail", "Post/{pi}/{pt}", "~/PostShow.aspx");
این الگو یو آر الی مثل "این-یک-تست-است/Post/2" را به صفحه‌ی PostShow.aspx میفرستد و در صفحه‌ی مقصد میتوانیم توسط ["Page.RouteData.Values["pi که منظور از pi همون PostId یا کد مقاله ما است، خوانده و نمایش دهیم. دلیل ارسال قسمت {pt} یا همان "این-یک-تست-است" می‌باشد و از pt منظورمان PostTitile یا عنوان مقاله‌است که در SEO سایت تاثیر زیادی دارد. 
نحوه استفاده از این تبدیل هم اینطور می‌تواند باشد.
ساخت لینک :
<a href='<%# string.Format("/Post/{0}/{1}",Eval("PostID"),Eval("PostTitle").ToString().Replace(" ","-")) %>'>
وقتی روی لینک کلیک می‌شود، به طور مثال چنین آدرسی در قسمت آدرس مرورگر ظاهر می‌شود. دلیل استفاده از Replace هم برای زیباتر شدن Url هست. چون فضای خالی در Url زیبا نیست.
Post/12/چگونه-طراحان-وب-به-جهنم-می-روند!؟
و در صفحه‌ی PostShow.aspx به این نحو میتوانیم اطلاعات مقاله‌ی مورد نظر را بدست بیاریم:
int pi = int.Parse(Page.RouteData.Values["pi"].ToString());
Posts post = (from p in con.Posts where p.PostID == pi select p).FirstOrDefault();
یا حتی برای نشان دادن اطلاعات از این روش استفاده کنیم:
<asp:EntityDataSource ID="EntityDataSource1" runat="server" 
        AutoGenerateWhereClause="True" ConnectionString="name=WebWorkEntities" 
        DefaultContainerName="WebWorkEntities" EnableFlattening="False" 
        EntitySetName="Posts" EntityTypeFilter="Posts" Where="" Select="">
        <WhereParameters>
            <asp:RouteParameter Name="PostID" RouteKey="pi" DbType="Int32" 
                DefaultValue="0" />
        </WhereParameters>
    </asp:EntityDataSource>
منطورم استفاده از asp:RouteParameter  در <WhereParameters> برای انتخاب مقاله است.
و برای زیباتر شدن کد نویسی، بهتر است الگو‌های تبدیل را در یک تابع جدا بنویسیم:
protected void Application_Start(object sender, EventArgs e)
        {
            RoutingSite(RouteTable.Routes);
        }

        public static void RoutingSite(RouteCollection route)
        {
            route.MapPageRoute("PostDetail", "Post/{pi}/{pt}", "~/PostShow.aspx");
            route.MapPageRoute("RouteAbout", "About-Me", "~/About.aspx");            
        }
مطالعه بیشتر
  • #
    ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۰ بهمن ۱۳۹۲، ساعت ۱۹:۵۰
    یک نمونه برنامه برای مثال Test-Routing.zip 
    • #
      ‫۱۰ سال و ۸ ماه قبل، دوشنبه ۱۴ بهمن ۱۳۹۲، ساعت ۲۳:۰۰
      سوال من در مورد وب فرم هایی که توی فولدر هستند هنوز پابرجاست
      شکل آدرس دهی این وب فرم‌ها چطوری میشه؟
      • #
        ‫۱۰ سال و ۸ ماه قبل، دوشنبه ۱۴ بهمن ۱۳۹۲، ساعت ۲۳:۲۲
        ممکنه بیشتر توضیح بدید! منظورتونو از فرم هایی که تو فولدر هستند متوجه نمیشم. مثلا فرم‌های قسمت مدیریتی رو میگید ، پوشه Admin ؟
        • #
          ‫۱۰ سال و ۸ ماه قبل، دوشنبه ۱۴ بهمن ۱۳۹۲، ساعت ۲۳:۵۹
          بله مثل همون پوشه ادمین
          من کلا فرم هام رو توی یک پوشه جدا گذاشتم به اسم WebForms
          حالا برای آدرس دهی اگه مثلا بنویسم ~/Details جواب نمیده اگه به صورت ~/WebForms/Details هم بنویسم بازم جواب نمیده!
          • #
            ‫۱۰ سال و ۸ ماه قبل، سه‌شنبه ۱۵ بهمن ۱۳۹۲، ساعت ۰۰:۳۶
            چرا جواب میده ، باید اینجوری بنویسید .
            RouteTable.Routes.MapPageRoute("Folder", "ShowFolder/{Id}/{Name}", "~/Admin/Show.aspx");
            در نمونه برنامه یه فولدر ساختم و کاری که خواستیدو انجام دادم. Test-Folder.zip  
            • #
              ‫۱۰ سال و ۸ ماه قبل، سه‌شنبه ۱۵ بهمن ۱۳۹۲، ساعت ۱۶:۳۸
              ممنون
              منم دقیقا همینطوری نوشتم ولی بازم ارور 404 میده
              الآن امتحان کردم در این حالتی که شما نوشتید جواب میده اما اگه کل فرم‌ها توی پوشه باشه جواب نمیده.
              شما هم اگه اون فرم Default رو بذارید توی پوشه ادمین می‌بینید که جواب نمیده!
              و یه سوال: چی کار کردید که وقتی برنامه اجرا میشه اسم صفحه اول (Default) رو توی آدرس بار نشون نمیده؟
              (پ.ن: همینطوری تغییرات کدها رو هم بنویسید متوجه میشم نیازی به نمونه برنامه نیست. با تشکر)
              • #
                ‫۱۰ سال و ۸ ماه قبل، سه‌شنبه ۱۵ بهمن ۱۳۹۲، ساعت ۱۸:۰۷
                زمانیکه فرم default رو در یک پوشه‌ی دیگر گذاشتید، برای اون یک route جدا تعریف کردید؟ الان آیا برنامه اطلاع داره زمانیکه به مسیر ریشه سایت وارد شد باید به کجا هدایت بشه؟
                routes.MapPageRoute("defaultRoute", "{*value}", "~/folder/default.aspx");
                • #
                  ‫۱۰ سال و ۸ ماه قبل، سه‌شنبه ۱۵ بهمن ۱۳۹۲، ساعت ۲۱:۱۸
                  باید برای تعریف لینک‌ها اینگونه عمل کنید.
                  <a href='<%# string.Format("../ShowFolder/{0}/{1}", Eval("Id") ,Eval("Name").ToString().Replace(" ", "-")) %>' ><%# Eval("Name") %></a>
                  .. باعث میشه یک فولدر به عقب برگرده و اینجوری درست کار میکنه.
                  در مورد اجرا شدن صفحه default هم دوستمون اشاره کردنند.
                  بازم نمونه برنامه ضمیمه کردم . فرم default رو تو پوشه‌ی ادمین بردم. وقتی برنامه هم اجرا میشه صفحه default در داخل پوشه‌ی ادمینو نشون میده.  Test-Folder-2.zip    
                  • #
                    ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۷ بهمن ۱۳۹۲، ساعت ۰۲:۰۵

                    بازم ممنون. فقط یه سوال دیگه. فرض کنید من یه چیزی به آدرس اصلی صفحه اضافه کردم. حالا می‌خوام به این آدرس جدید دوباره یه چیز دیگه اضافه کنم. باید چی کار کنم؟ اینجا وقتی یک یا چند تا چک لیست انتخاب میشه یا مثلا چیزی از لیست باکس‌ها انتخاب میشه عبارت مربوطه اش به آدرس اضافه میشه. چطوری این کارو کرده؟ اینجوری که آدرس ثابت نیست و می‌تونه حالت‌های مختلفی داشته باشه! یا مثلا وقتی یک مورد انتخاب شده حذف میشه چطوری عبارت مربوطه اش از وسط آدرس حذف میشه؟! 

                    • #
                      ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۷ بهمن ۱۳۹۲، ساعت ۰۴:۱۱
                      این نوع routing خاص سمت کلاینت برنامه‌های تک صفحه‌ای وب را با استفاده از کتابخانه‌ای مانند path.js می‌شود انجام داد. مثال‌های آن‌را به همراه سورس صفحات آن بررسی کنید.
                      نمونه آن‌را در مطلب « پیاده سازی دکمه «بیشتر» یا «اسکرول نامحدود» به کمک jQuery در ASP.NET MVC  » (کامنت آخر آن) پیاده سازی شده می‌توانید مشاهده و دریافت کنید. از این قابلیت در سایت جاری در حال استفاده است. مثلا اگر به قسمت مطالب در بالای صفحه مراجعه کنید، چنین آدرسی قابل مشاهده است:
                      https://www.dntips.ir/postsarchive#/page/1/date/desc  
                      در پایین صفحه اگر دراپ داون‌های مرتب سازی را تغییر دهید، نام فیلد یا صعودی و نزولی بودن آدرس تغییر می‌کنند. شماره صفحه نیز با هر بار کلیک بر روی دکمه‌ی بیشتر یکی اضافه می‌شود. همچنین این آدرس‌ها را می‌شود ذخیره و عینا بازیابی کرد.
  • #
    ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۷ بهمن ۱۳۹۲، ساعت ۱۵:۴۷
    سلام؛ خیلی ممنون از مطلب مفیدتون.
    من از دستورات route به شکل زیر استفاده میکنم
    RouteTable.Routes.MapPageRoute("Post", "Post/{Id}/{title}", "/~showpost.aspx");
    این دستوارت به خوبی کار میکنند و مشکلی هم نیست. اما مسئله ای که وجود داره اینه که وقتی کاربر بخواد url رو دستکاری کنه و مثلا عدد id روتغییر بده، title در url تغییر نمیکنه. من سایت‌های زیادی رو دیدم که این ایراد رو دارن. بسیاری از سایت‌های خبری. اما سایت جاری چنین مشکلی نداره. یعنی وقتی شما id رو در url تغییر میدید، عنوان پست در url هم تغییر میکنه. لطفا در مورد چگونگی پیاده سازی این روش توضیح بدید.
    متشکرم
    • #
      ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۷ بهمن ۱۳۹۲، ساعت ۱۶:۰۸
      var id = Page.RouteData.Values["id"];
      var title = Page.RouteData.Values["title"];
      
      var blogPost = _postsService.FindPost(id);
      if(blogPost == null)
      {
        Response.RedirectPermanent("~/notfound");
      }
      
      if(blogPost.Title != title)
      {
        Response.RedirectPermanent("~/post/" + id + "/" + blogPost.Title);
      }
      سیستم مسیریابی، اطلاعات id و title وارد شده توسط کاربر را به شما می‌دهد. زمانیکه می‌خواهید مطلب را نمایش دهید، این title دریافتی را با title واقعی مطلب مانند کدهای فوق مقایسه کنید. (البته بهتر است از GenerateSlug استفاده کنید و عناوین نهایی را بر این اساس مقایسه و اصلاح کنید)
      • #
        ‫۴ سال و ۹ ماه قبل، سه‌شنبه ۱۹ آذر ۱۳۹۸، ساعت ۱۶:۴۴
        سلام ببخشید  اینجا _postsService  چی هستش؟
        • #
          ‫۴ سال و ۹ ماه قبل، سه‌شنبه ۱۹ آذر ۱۳۹۸، ساعت ۱۷:۰۰
          یک فیلد تعریف شده‌ی در سطح فرم که به یک کلاس یا اینترفیس اشاره می‌کند که دارای متد FindPost است. هدف نمایش دریافت null از یک متد بوده. خود متد مهم نیست.
  • #
    ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۸ بهمن ۱۳۹۲، ساعت ۰۳:۰۶
    سلام. سوال دیگه ای هم داشتم.
    چطور جلوی دسترسی کاربران به آدرس اصلی فایل رو بگیریم؟
    مثلا در مثال زیر : 
    route.MapPageRoute("PostDetail", "Post/{pi}/{pt}", "~/PostShow.aspx");
    کاربر نتونه به فایل postshow.aspx  به صورت مستقیم دسترسی داشته باشه
    • #
      ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۸ بهمن ۱۳۹۲، ساعت ۰۴:۵۷
      در ASP.NET MVC برای اینکه کسی نتواند فایل‌های View را مستقیما فراخوانی کند، دسترسی به آن‌ها در فایل web.config کلا بسته شده:
        <system.web>
          <httpHandlers>
            <remove verb="*" path="*.aspx" />
            <add path="*.aspx" verb="*" type="System.Web.HttpNotFoundHandler" />
          </httpHandlers>
        </system.web>
      
        <system.webServer>
          <validation validateIntegratedModeConfiguration="false" />
          <handlers>
            <add name="BlockViewHandler" path="*.aspx" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
          </handlers>
        </system.webServer>
      • #
        ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۸ بهمن ۱۳۹۲، ساعت ۰۵:۳۵
        جسارتا منظورم asp.net webform بود
        • #
          ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۸ بهمن ۱۳۹۲، ساعت ۰۵:۳۸
          هدفم طرح یک ایده بود. امتحان کردید؟ (HttpNotFoundHandler مشترک است بین MVC و وب فرم‌ها)
      • #
        ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۸ بهمن ۱۳۹۲، ساعت ۰۵:۴۳
        نکته ای که الان یادم اومد اینه که در برنامه من، کاربران به صفحات اصلی سایت بصورت routing دسترسی دارند و در قسمت داشبورد به صورت ادرس مستقیم.
        چطور میشه در webform این دو حالت رو در یک سایت از هم تفکیک کرد؟
        متشکرم
        • #
          ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۸ بهمن ۱۳۹۲، ساعت ۰۵:۴۷
          فایل وب کانفیگی را که دسترسی به aspx‌ها را not found اعلام می‌کند، داخل همان پوشه مدنظر قرار دهید. (در MVC هم دقیقا به همین نحو عمل شده‌است. یک فایل web.config دومی را در پوشه views قرار داده‌اند)
          • #
            ‫۱۰ سال و ۸ ماه قبل، شنبه ۱۹ بهمن ۱۳۹۲، ساعت ۰۵:۳۳
            سلام
            دستورات ذکر شده رو در فایل web.config قرار دادم. دسترسی به فایلهای aspx قطع شد و فقط میشد از طریق routing دسترسی داشت. اما مشکلی که بوجود اومد این بود که وقتی نام سایت رو در مرورگر وارد میکردم، خطای زیر رو دریافت کردم
            The resource cannot be found.
            
            Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 
            
            Requested URL: /Default.aspx
            به ذهنم رسید که در فایل global دستور زیر رو وارد کنم
            routes.MapPageRoute("Default", "", "~/default.aspx", False)
            وقتی این کارو کردم دیدم که مشکل دسترسی به فایل default.aspx حل شد اما دسترسی مستقیم به فایلهای aspx که در فولدرهای دیگر بودند دچار مشکل شد
            در وب جستجو کردم و به لینکهای روبرو رسیدم ( +  )
            اما نتیجه ای نداد.
            • #
              ‫۱۰ سال و ۸ ماه قبل، شنبه ۱۹ بهمن ۱۳۹۲، ساعت ۱۳:۴۱
              دستورات not found handler رو در web.config ریشه اصلی نوشتید یا در یک وب کانفیگ جدید در پوشه‌ای که می‌خواهید؟ در ریشه اصلی روی تمام زیر پوشه‌ها به علت ارث بری تاثیر دارد.
              • #
                ‫۱۰ سال و ۸ ماه قبل، یکشنبه ۲۰ بهمن ۱۳۹۲، ساعت ۰۱:۱۳
                چون اون فایلها در ریشه سایت هستند، بنابراین در web.config ریشه اصلی نوشتم
                چه کاری میتونم بکنم؟
  • #
    ‫۱۰ سال و ۴ ماه قبل، سه‌شنبه ۳۰ اردیبهشت ۱۳۹۳، ساعت ۱۹:۳۹
    سلام؛ تمام کارهایی که شما نوشتید رو نوشتم و انجام دادم. کار میکنه ولی دو تا مشکل داره:
    1- استیل‌های صفحه رو بار گذاری نمیکنه. یعنی css‌هایی که نوشتم و در پوشه ای به نام css ذخیره کردم رو نمیاره. البته من از مستر استفاده میکنم. استایل‌های مستر میاد اما استایل‌های شخصی اون صفحه نه.
    2-مسیر سایتم دارای یک اسم به نام publicity است:
    ..../www.site.com/publicity
    که وقتی آدرس‌ها رو درست میکنم این شکل میشه:
     www.site.com/post/1325
    و publicity حذف میشه از آدرس که باعث میشه برنامه ارور بده که همچین آدرسی نیست .
    حالا باید چکار کنم؟
    • #
      ‫۱۰ سال و ۴ ماه قبل، سه‌شنبه ۳۰ اردیبهشت ۱۳۹۳، ساعت ۲۱:۵۶
      در حالت کلی در وب فرم‌ها، برای مسیردهی سازگار با Routing باید از ResolveUrl استفاده کنید.
      برای اسکریپت‌ها:
      <script type='text/javascript' src='<%= ResolveUrl("~/Scripts/test.js") %>'></script>
      برای شیوه‌نامه‌ها:
      <link rel="stylesheet" href="<%= ResolveUrl("~/myStylysheet.css")%>"  type="text/css" />
      متد ResolveUrl به صورت خودکار مسیر صحیح را تولید می‌کند.

      اما ... این روش کار کردن صحیح نیست. چون به زودی به تعداد زیادی فایل اسکریپت و CSS لینک داده شده در صفحه می‌رسید. برای یکی کردن آن‌ها یا از ScriptManager استفاده کنید (برای اسکریپت‌ها) و یا از روش‌های bundling & minification که با فایل‌های CSS و JS سازگار است. مسیریابی‌ها را هم به صورت خودکار تصحیح می‌کند.
      • #
        ‫۱۰ سال و ۴ ماه قبل، چهارشنبه ۳۱ اردیبهشت ۱۳۹۳، ساعت ۱۵:۱۰
        تشکر.
        اما من روش bunding & minification رو متوجه نشدم.مطلب آموزشیش رو از کجا باید بخونم؟
        منظورم مطلب آموزشی فارسی است.
        • #
          ‫۱۰ سال و ۴ ماه قبل، چهارشنبه ۳۱ اردیبهشت ۱۳۹۳، ساعت ۱۵:۲۰
          • #
            ‫۱۰ سال و ۲ ماه قبل، سه‌شنبه ۲۱ مرداد ۱۳۹۳، ساعت ۱۸:۲۸
            سلام؛ وقتی این کد رو توی کد بیهایند مستر پیج برای گرفتن ID  کاربر قرار میدم بهم ارور میده
             Page.RouteData.Values("pi").ToString()
            چون مستر پیج خاصیتی به اسم page نداره. برای همین page.routeData رو null برمیگردونه.
            • #
              ‫۱۰ سال و ۲ ماه قبل، سه‌شنبه ۲۱ مرداد ۱۳۹۳، ساعت ۱۸:۴۱
              از this.Request.RequestContext.RouteData استفاده کنید.
            • #
              ‫۱۰ سال و ۲ ماه قبل، سه‌شنبه ۲۱ مرداد ۱۳۹۳، ساعت ۱۸:۴۷
              سلام . معمولا در code behind صفحات داخلی ID  رو میگیرند ، نه در مستر پیج و اینکه احتمالان اشتباه میکنید. Page یک متد توکار هستش و همیشه وجود داره . اگر به null برمیخورید احتمالان به خاطر استفاده از .ToString هستش . اگه مقداری که وجود نداره رو ازش .ToString() بگیریم به ارور    "object reference not set to an instance of an object"    بر میخوریم . در این آموزش نمونه برنامه‌های زیادی  وجود داره ، ازشون کمک بگیرید.
              • #
                ‫۱۰ سال و ۲ ماه قبل، سه‌شنبه ۲۱ مرداد ۱۳۹۳، ساعت ۱۸:۵۸
                نکته‌ی دیگه ای اینه که گرفتن مقدار از یک Route به این صورت هستش.
                var id = Page.RouteData.Values["pi"].ToString();
                شما از () استفاده کردید.
                • #
                  ‫۱۰ سال و ۲ ماه قبل، سه‌شنبه ۲۱ مرداد ۱۳۹۳، ساعت ۱۹:۵۴
                  آخه من با Vb مینویسم و وقتی این کد رو مینویسم ارور میده که نباید از[] استفاده بشه.
                  کد رو به این تغییر دادم ولی بازم ارور دارم :
                  Me.Request.RequestContext.RouteData.Values("pi")
                  ارور اینه:
                  Object reference not set to an instance of an object.
                  • #
                    ‫۱۰ سال و ۲ ماه قبل، سه‌شنبه ۲۱ مرداد ۱۳۹۳، ساعت ۲۰:۲۲
                    یه نمونه کد با زبان بسیار شیرین VB گذاشتم . ارور هم عرض کردم این ارور به خاطر این هستش که مقدار نال رو میخواهید بخونید  . موفق باشید.
      • #
        ‫۹ سال و ۱۰ ماه قبل، شنبه ۲۴ آبان ۱۳۹۳، ساعت ۱۳:۳۸
        سلام
        واسه من تصاویر سایت هم نشان داده نمیشه ، برای تصاویر هم باید همین کار رو بکنم؟ 
        • #
          ‫۹ سال و ۱۰ ماه قبل، شنبه ۲۴ آبان ۱۳۹۳، ساعت ۱۴:۰۷
          <img src='<%=ResolveUrl("~/images/brain.png")%>' />
          <asp:ImageButton ID="ImageButton1" ImageUrl="~/images/brain.png"  runat="server" />
          <asp:Image runat="server" ID="imgHelp"  ImageUrl="~/Images/myImage.jpg" />
          • #
            ‫۹ سال و ۱۰ ماه قبل، شنبه ۲۴ آبان ۱۳۹۳، ساعت ۱۴:۳۴
            ممنون
            حالا فکر کنید من  مطالب کاربر که حاوی تصاویر نیز هست در دیتابیس ذخیره کرده ام و می‌خوام در صفحه نمایش بدم ، حالا چجور میتونم تصاویری که تو مطلب هست که در زمان اجرا در صفحه ریخته میشه نشون بدم؟
            ببخشید یک سوال دیگه ، اصلا میشه گفت فقط فایلهایی که به پسوند aspx ختم میشند رو از دسترسی مستقیم خارج کن و بقیه فایلها آزاد باشند؟
            • #
              ‫۹ سال و ۱۰ ماه قبل، شنبه ۲۴ آبان ۱۳۹۳، ساعت ۱۵:۲۲
              - این نوع تصاویر را بجای آدرس نسبی، با آدرس مطلق ذخیره کنید.
              - از HTML Agility pack برای ویرایش و اصلاح src در حین رندر نهایی استفاده کنید.
              - امکان خارج کردن منابع از سیستم URL rewrite وجود دارد:
              <rule name="RewriteUserFriendlyURL1" stopProcessing="true">
                <match url="^([^/]+)/?$" />
                <conditions>
                   <add input="{URL}" negate="true" pattern="\.png$" />
                </conditions>
              </rule>
  • #
    ‫۱۰ سال و ۲ ماه قبل، چهارشنبه ۲۵ تیر ۱۳۹۳، ساعت ۱۶:۰۰
    با سلام و تشکر بابت مقاله خوبتون .
    من یه صفحه به اسم add.aspx تو فولدر Admin سایتم که با asp.net web form ایجاد شده دارم و میخوام وقتی کاربر آدرس http://mysite/Admin  را تو آدرس بار وارد کرد بطور اتوماتیک وارد اون صفحه(Add.aspx) بشه .چطوری میتونم اینکارو بکنم ؟ با تشکر 
    • #
      ‫۱۰ سال و ۲ ماه قبل، چهارشنبه ۲۵ تیر ۱۳۹۳، ساعت ۱۶:۳۵
      سلام به این صورت در فایل Global.asax.cs
              // using System.Web.Routing; //Must Be Added
      
              public static void RoutingSite(RouteCollection route)
              {
                  //تعریف  Route
                  route.MapPageRoute("Admin", "Admin", "~/admin/add.aspx");            
              }
      
              protected void Application_Start(object sender, EventArgs e)
              {
                  RoutingSite(RouteTable.Routes);            
              }
      • #
        ‫۱۰ سال و ۲ ماه قبل، پنجشنبه ۲۶ تیر ۱۳۹۳، ساعت ۱۷:۴۵
        ممنون بابت جوابتون .من اینکارو انجام میدم ولی وقتی کاربر آدرس http://mysite/Admin  را تو آدرس بار وارد میکنه اونو به دایرکتوری فولدر Admin که شامل چندین صفحست میبره و باز کاربر باید خودش رو لینک Add.aspx کلیک کنه تا بتونه وارد اون صفحه بشه ..امکانش هست کاربر اتوماتیک وارد صفحه   Add.aspx   بشه ؟
        • #
          ‫۱۰ سال و ۲ ماه قبل، پنجشنبه ۲۶ تیر ۱۳۹۳، ساعت ۱۸:۱۳
          خواهش میکنم ، این مشکل به خاطر اینه که وقتی شما آدرس Admin را در مرورگر تایپ میکنید قبل از اینکه برنامه به کد‌های روتینگ برسه برنامه ، Admin رو پوشه میدونه و فکر میکنه شما میخواهید پوشه‌ی ادمین رو باز کنید و این کارو انجام میده و به کد‌های روتینگ نمیرسه. برای حل این مشکل باید نام روتینگ را به نام دیگه ای تغییر بدید مثل این
           public static void RoutingSite(System.Web.Routing.RouteCollection route)
              {
                  //تعریف  Route
                  route.MapPageRoute("Admin", "AdminAdd", "~/admin/add.aspx");
              }
          
              protected void Application_Start(object sender, EventArgs e)
              {
                  RoutingSite(System.Web.Routing.RouteTable.Routes);
              }
          با این روتینگ وقتی شما آدرس  http://mysite/AdminAdd  رو میزنید صفحه‌ی add.aspx در پوشه‌ی ادمین رو اجرا میکنه . یه نمونه برنامه براتون ساختم و همین کاریو که خواستید رو انجام دادم.
  • #
    ‫۱۰ سال و ۱ ماه قبل، سه‌شنبه ۲۸ مرداد ۱۳۹۳، ساعت ۱۴:۵۳
    سلام ممکنه منو راهنمایی کنید
     RouteTable.Routes.MapPageRoute("Gallery", "{PageName In Database}", "~/Main.aspx");
    من جدولی در دیتابیس دارم که نام صفحات رو ذخیره میکنم چگونه میتونم مقدار PageName in Databse
    چک کنه اگه داخل اون جدول بود وارد صفحه main بشه
    • #
      ‫۱۰ سال و ۱ ماه قبل، سه‌شنبه ۲۸ مرداد ۱۳۹۳، ساعت ۱۵:۱۱
      سلام.
      این روتینگ رو تعریف میکنید.
       RouteTable.Routes.MapPageRoute("Gallery", "Page/{PageName}", "~/Main.aspx");
      در صفحه‌ی Main.aspx
      string pi = Page.RouteData.Values["PageName"] + "" ;
      Pages page = (from p in context.Pages where p.PageName == pi select p).FirstOrDefault();
      if (page ==  null )
              Response.Redirect("/");
        else
          // نمایش اطلاعات  
      • #
        ‫۱۰ سال و ۱ ماه قبل، سه‌شنبه ۲۸ مرداد ۱۳۹۳، ساعت ۲۰:۱۴
        سلام؛ ممنونم از پاسخ خوبتون. آیا امکان دارد بتوان در Page/{PageName لغت Page را حذف کرد و بعد دومین که زده میشود چک کند؟
        • #
          ‫۱۰ سال و ۱ ماه قبل، سه‌شنبه ۲۸ مرداد ۱۳۹۳، ساعت ۲۲:۳۸
          این کار شدنی هستش که چنین روتینگی داشته باشیم
           RouteTable.Routes.MapPageRoute("Gallery", "{PageName}", "~/Main.aspx");
          ولی تمام آدرس‌ها به این صفحه ارجاع داده میشه و شما هر آدرسی که وارد کنید به صفحه‌ی ذکر شده میره و این مشخصه که سایتی که دارید مینویسید فقط همین صفحه رو نداره.
          البته این نوع روتینگ کاربرد خاصی هم داره و من تو چند تا سایت که  میخواستیم توسعه بدیم  استفاده کردم به این صورت که صفحاتی که توسط گوگل ایندکس شده بود و نمیخواستیم از دست بدیم با این روتینگ چک میکردیم و صفحاتی که ایندکس بود رو به آدرس جدیدش میفرستادیم.
           
  • #
    ‫۱۰ سال و ۱ ماه قبل، چهارشنبه ۲۹ مرداد ۱۳۹۳، ساعت ۰۴:۳۷
    سلام .من دقیقا مانند کد‌های شما رو نوشتم ولی یه مشکلی هست 
    زمانی که از لینکی مثل زیر استفاده می‌کنم 
    <a href="article/da/name">...</a>
    چیزی که در نوار آدرس به وجود میاد تقریبا مثل زیر خواهد بود :
    localhost://article/da/name
    و زمانی که می‌خوام در این حالت به یه آدرس دیگه برم مثل زیر 
    <a href="about">...</a>
    درست کار نمیکنه و مقدار About رو جایگزین آخرین مقدار آدرس قبلی میکنه . مثلا :
    localhost://article/da/about
    منظورم اینه که به روت بر نمیگرده . باید چکار کرد برای حل این مشکل
    • #
      ‫۱۰ سال و ۱ ماه قبل، چهارشنبه ۲۹ مرداد ۱۳۹۳، ساعت ۰۴:۵۶
      کمی بالاتر توضیح دادن ... در حالت کلی در وب فرم‌ها، برای مسیردهی سازگار با Routing باید از ResolveUrl استفاده کنید.
  • #
    ‫۹ سال و ۱۱ ماه قبل، چهارشنبه ۷ آبان ۱۳۹۳، ساعت ۱۸:۴۰
    پارامترهای صفحات من از نوع رشته هستند نه عدد بطور مثال :
    localhost:56254/type/Brand/سمپلر/متغیر/5 میکرولیتر با سرنگ اضافه

    برای کلیک روی لینک تگ A در قیمت href با استفاده از strinf.Format() خط را جایگزین فاصله کردم اما اطلاعاتم را نمیخواند چون در دیتابیس فاصله جای خط وجود دارد. من برای خواندن اطلاعات از دیتالیست به همراه EntityDataSource استفاده کرده ام مانند :
    <asp:EntityDataSource ID="EntityDataSource1" runat="server" 
                ConnectionString="name=mainfardbEntities" 
                DefaultContainerName="mainfardbEntities" EnableFlattening="False" 
                EntitySetName="T_Product"  Where="it.[CoName]=@category and it.[CatName]=@sub and it.[SubCatName]=@thi and it.[ProdName]=@det">
                <WhereParameters>
                    <asp:QueryStringParameter DbType="String" Name="category" QueryStringField="category" />
                    <asp:QueryStringParameter DbType="String" Name="sub" QueryStringField="sub" />
                    <asp:QueryStringParameter DbType="String" Name="thi" QueryStringField="thi" />
                    <asp:QueryStringParameter DbType="String" Name="det" QueryStringField="det" />
                </WhereParameters>
            </asp:EntityDataSource>

    چگونه میتوانم برای خواندن اطلاعات پارامتر خود را بصورت اولیه یعنی با فاصله بخوانم؟
    ممنون از همه عزیزان
      • #
        ‫۹ سال و ۱۱ ماه قبل، چهارشنبه ۷ آبان ۱۳۹۳، ساعت ۱۹:۲۶
        ممنون از پاسخ شما
        متاسفانه به نتیجه ای نرسیدم
        ممکنه خودتون بیشتر توضیح بدین؟
        باید بگم من از روش url rewrite استفاده میکنم
        <rewrite url="~/type/(.+)/(.+)/(.+)/(.+)" to="~/type/Product-Details.aspx?category=$1&amp;sub=$2&amp;thi=$3&amp;det=$4" />
        من چطور میتونم به پارامتر ارسالی قبل از اینکه وارد شدن به شرط EntityDataSource  دست پیدا کنم و اون رو تغییر بدم
        البته من احساس میکنم مطلب گذاشته شده شما رو نتونستم درک بکنم
        • #
          ‫۹ سال و ۱۱ ماه قبل، چهارشنبه ۷ آبان ۱۳۹۳، ساعت ۲۱:۳۰
          هنگام تولید URL، اجزای قسمت‌های مختلف آن باید encode شوند؛ در غیر اینصورت عموما قابل پردازش نخواهند بود.
          var url = "<a href='http://site/page/" + Uri.EscapeDataString(item.Category) + "'>Item1</a>";
          برای مثال فاصله تبدیل می‌شود به 20% و امثال آن. از متد Uri.EscapeDataString برای encode کردن اجزای مختلف URL باید استفاده کنید تا به نتیجه‌ی صحیحی برسید. زمانیکه این encoding انجام شد، طرف کدهای دات نتی که این اجزاء یا کوئری استرینگ‌ها را دریافت می‌کند، نیازی به هیچ تغییری یا اصلاحی نخواهد بود، چون به صورت خودکار قابلیت پردازش encoding آدرس دریافتی را دارد (در پشت صحنه از متد HttpUtility.UrlDecode استفاده می‌کند). برای نمونه مقادیر دریافتی Page.RouteData.Values را بررسی کنید.
  • #
    ‫۹ سال و ۱۰ ماه قبل، دوشنبه ۲۶ آبان ۱۳۹۳، ساعت ۱۶:۳۳
    با سلام؛ من از این روش  از تکنیک ای‌جکس استفاده می‌کنم، ولی نمیدونم الان که Url‌ها رو با تکنیک شما بازنویسی کردم چگونه توابع رو فراخوانی کنم؟ به وب سرویس دسترسی دارم ولی تابع داخلش اجرا نمیشه
  • #
    ‫۹ سال و ۹ ماه قبل، پنجشنبه ۲۰ آذر ۱۳۹۳، ساعت ۱۵:۰۹
    با سلام؛ وسایتم خوب کار میکنه فقط وقتی این قسمت که به جای فضای خالی _ بزار رو گزاشتم مشکل پیدا کردم چطور درستش کنم. 
     <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("NewsID", "ShowNews.aspx?id={0}")+ Eval("NewsTitle","&_title={0}").ToString().Replace(" ","_")%>'
    این خطهای اضافی دنباله خبر ماله چیه که درست شده اخه من برای درج خبر کاراکتر اضافی وارد نکردم که؟کلا چرا بعد از خبر هام این قدر-------- میزاره 
    http://localhost:28625/ShowNews.aspx?id=25&_title=%D8%A2%D8%AE%D8%B1%DB%8C%D9%86_%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1_%D8%A7%D8%B2_%22%D9%85%D8%B1%D8%AA%D8%B6%DB%8C_%D9%BE%D8%A7%D8%B4%D8%A7%DB%8C%DB%8C%22__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
    • #
      ‫۹ سال و ۹ ماه قبل، پنجشنبه ۲۰ آذر ۱۳۹۳، ساعت ۱۵:۱۹
      - از روش‌های ابداعی برای encoding رشته‌ها در وب استفاده نکنید. کمی بالاتر توضیح دادم که باید از Uri.EscapeDataString استفاده کنید؛ از این جهت که حروفی که باید escape شوند، به یک فاصله‌ی ساده ختم نمی‌شوند. یک لیست طولانی دارد.
      - اگر قصدتان تولید slug است، از متد GenerateSlug مطرح شده در مطلب «بهینه سازی برنامه‌های وب ASP.NET برای موتورهای جستجو (SEO)» ایده بگیرید. در انتهای آن یک متد Trim هم فراخوانی شده‌است (برای حذف فواصل خالی در ابتدا و انتهای رشته).
      • #
        ‫۹ سال و ۹ ماه قبل، شنبه ۲۲ آذر ۱۳۹۳، ساعت ۲۲:۳۹
        سلام برای خوندن اطلاعات از کوئری استرینگ باید چطور دستور سلکت رو نوشت من وقتی از روش بالایی که گفتم استفاده میکردم میگفتم که مقدار id رو بخون از کوئری استرینگ الان نوشتم where newsid=@pi
        بعدم تو sqlدیتا سورس گفتم از کوئری استرینگ مقدار piرو بخون ولی ارور میده الان بگم چی رو بخون
        • #
          ‫۹ سال و ۹ ماه قبل، شنبه ۲۲ آذر ۱۳۹۳، ساعت ۲۲:۵۴
          SqlDataSource1.SelectParameters.Add("@param1", value1);
          • #
            ‫۹ سال و ۹ ماه قبل، شنبه ۲۲ آذر ۱۳۹۳، ساعت ۲۳:۱۵
            مقداری که از کوئری استرینگ میخونه چیه همون pi? آخه من قبلا id میگفتم بخون وجواب میداد اما الان گفتم pi رو بخون ولی جواب نداد.
            • #
              ‫۹ سال و ۹ ماه قبل، شنبه ۲۲ آذر ۱۳۹۳، ساعت ۲۳:۱۹
              - یکبار متن و نظرات را کامل مطالعه کنید. اگر از روش جدید مسیریابی استفاده کنید، دیگر نباید کوئری استرینگی در URL شما مشاهده شود (یکی از اهداف اصلی سیستم مسیریابی). در اینجا یک الگو را باید در متد RouteTable.Routes.MapPageRoute ثبت کنید.
              pi بر اساس همان الگوی ثبت شده‌ی {Post/{pi}/{pt است؛ در مثالی که در متن زده شده‌.
              • #
                ‫۹ سال و ۹ ماه قبل، یکشنبه ۲۳ آذر ۱۳۹۳، ساعت ۱۲:۳۸
                سلام من تو globalاینجوری نوشتم
                <%@ Application Language="C#" %>
                <script runat="server">
                
                    void Application_Start(object sender, EventArgs e) 
                    {
                        // Code that runs on application startup
                      System.Web.Routing.RouteTable.Routes.MapPageRoute("NewsDatils", "News/{pi}/{pt}", "~/ShowNews.aspx");
                
                    }
                    
                    void Application_End(object sender, EventArgs e) 
                    {
                        //  Code that runs on application shutdown
                
                    }

                بعد تو صفحه لینک اینجوری نوشتم
                <asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl='<%# string.Format("/News/{0}/{1}",Eval("NewsID"),Eval("NewsTitle").ToString().Replace(" ","-")) %>' Text='<%# Eval("NewsTitle") %>'></asp:HyperLink>
                و تو shownews الان مقدارpi برابر null
                int p = int.Parse(Page.RouteData.Values["pi"].ToString());
                اینم اروری که نشون میده
                Cannot use a leading .. to exit above the top directory.
                • #
                  ‫۹ سال و ۹ ماه قبل، یکشنبه ۲۳ آذر ۱۳۹۳، ساعت ۱۳:۰۸
                  به احتمال زیاد در صفحه یک چنین آدرسی را دارید:
                  <asp:Image ImageUrl="..\foo.jpg" />
                  در اینجا .. به یک سطح بالاتر از ریشه سایت اشاره می‌کند که معتبر نیست. بجای .. از ~ استفاده کنید یا از روش ResolveUrl که کمی بالاتر در نظرات توضیح داده شد.
                  • #
                    ‫۹ سال و ۹ ماه قبل، یکشنبه ۲۳ آذر ۱۳۹۳، ساعت ۱۸:۵۸
                    ممنون. تو صفحه دوتا ادرس فایل‌های js رو به این صورت ../ داده بودم و عوض کردم با ~ و مشکل حل شد.
                    • #
                      ‫۹ سال و ۹ ماه قبل، یکشنبه ۲۳ آذر ۱۳۹۳، ساعت ۲۰:۰۲
                      سلام؛ چطور یه لینک بسازه به خانه برگرده. آخه وقتی مثل قبل امتحان کردم اینطور:
                      localhost:28625/News/26/~/default.aspx
                      شد؟
                      • #
                        ‫۹ سال و ۹ ماه قبل، دوشنبه ۲۴ آذر ۱۳۹۳، ساعت ۰۲:۵۴
                        سلام ،  به این صورت 
                         <a href=<%= ResolveUrl("~") %> >Home</a>
                         <a href="/" >Home</a>

  • #
    ‫۹ سال و ۹ ماه قبل، چهارشنبه ۲۶ آذر ۱۳۹۳، ساعت ۱۶:۱۳
    با سلام؛ همه چیز عالی کار کرده فقط یه مشکل دارم اونه که تو url به کاراکترهای / ، : ، و.... گیر میده و iis اخطار میگیره راهشم اینه که تو ادرس دهی بیام به جای این کاراکترها - یا + بزارم تو این لینک چطور بنویسم که مشکلم حل شه
    NavigateUrl='<%# string.Format("/News/{0}/{1}",Eval("NewsID"),Eval("NewsTitle").ToString().Replace(" ","-")
    به جای کد زیرچطور بنویسم که درست کار کنه. تشکر
    Replace(" ","-")
  • #
    ‫۹ سال و ۹ ماه قبل، چهارشنبه ۱۷ دی ۱۳۹۳، ساعت ۱۵:۴۶
    با سلام؛ جدولی دارم که لیست دانلود‌ها رو نشون میده. وقتی روی یک لینک از جدول کلیک میکنی، میخام چنین آدرسی رو نشون بده:
    آشنایی با قوانین کار/ ReDownload/1127/
    حالا برای اینکه لیست دانلود‌ها که یکسری مقاله هست، توی جستجوی گوگل بیشتر به چشم بخوره، اومدم آدرس بالا رو تبدیل به این آدرس کردم:
    docx. اشنایی با قوانین کار/ ReDownload/1127/
    ولی متاسفانه وقتی روی لینک کلیک میکنی http error 404 -not found
    حالا سوال اصلی اینه، کلا روش من غلطه یا باید تنظیمات خاصی رو اعمال کنم؟
    • #
      ‫۹ سال و ۹ ماه قبل، چهارشنبه ۱۷ دی ۱۳۹۳، ساعت ۱۷:۰۲
      مرجع رسمی مسیریابی در وب فرم‌ها عنوان می‌کنه که URL routing allows you to configure an application to accept request URLs that do not map to physical files. یعنی چون آدرس شما الان پسوند پیدا کرده، دیگه وارد سیستم مسیریابی نمیشه و به صورت یک فایل فیزیکی پردازش میشه. یعنی در مسیر و پوشه‌ای شبیه به آدرسی که نوشتید به دنبال اون فایل می‌گرده (که نیست و به همین جهت خطای 404 رو دریافت می‌کنید). البته با تنظیم RouteTable.Routes.RouteExistingFiles = true امکان تغییر این پیش فرض هست. در این حالت درخواست تمام فایل‌های فیزیکی وارد سیستم مسیریابی میشن. البته در این مورد خاص باید یک IRouteHandler بنویسید تا این درخواست فایل رسیده رو پردازش کنه.
      • #
        ‫۹ سال و ۹ ماه قبل، چهارشنبه ۱۷ دی ۱۳۹۳، ساعت ۱۷:۴۵
        فایل فیزیکی وجود نداره پسوندم برای جستجو تو گوگل اضافه کردم. تنظیمان مورد نظرم رو اضافه کردم  در اربطه handler بیشترم لطفا توضیح بدین ممنون میشم
        stackoverflow
         از توضیحات بالام استفاده کردم ولی جوابی نگرفتم
        • #
          ‫۹ سال و ۹ ماه قبل، چهارشنبه ۱۷ دی ۱۳۹۳، ساعت ۱۹:۳۰
          گوگل اینقدر هوشمند هست که بتونه تشخیص بده الان درخواست یک فایل word رو داده ولی جوابش html هست یعنی یکجا کار مشکل داره و نمره‌ی منفی بهت می‌ده. بهتره وقت بذاری و مباحث اصلی SEO رو در سایت بخونی.
          • #
            ‫۹ سال و ۹ ماه قبل، چهارشنبه ۱۷ دی ۱۳۹۳، ساعت ۱۹:۴۷
            من دنبال آدرس جعلی نیستم. تو بعضی سایت‌ها مثل این
            somesite.ir/thesis/pdf/1.pdf
            لینک رو انطوری داده کلیک که میکنی دانلود میکنه. گوگل هم این لینک رو به عنوان یه فایل pdf میشناسه.
  • #
    ‫۹ سال و ۶ ماه قبل، شنبه ۲۳ اسفند ۱۳۹۳، ساعت ۱۵:۵۹
     نکته: .(نقطه) در مسیری مانند: products/.net ، ASP.NET  را وادار می‌کند تا با این درخواست همانند درخواست یک صفحه رفتار کند در صورتی که صفحه ای در کار نیست و منظور محصولی با عنوان net.  می‌باشد. جهت حل این مشکل از / در آخر آدرس باید استفاده شود.   
  • #
    ‫۹ سال و ۳ ماه قبل، چهارشنبه ۳ تیر ۱۳۹۴، ساعت ۱۴:۲۶
    با تشکر از مطلب خوبتون. یه سوالی داشتم
    همونطور که میدونید مجموعه RouteCollection استاتیک است و اگر بخواهیم نمونه ای از آن بسازیم امکانش وجود ندارد.
    ولی اگر ما بخواهیم در هر بار استارت شدن سیشن، مجموعه خاصی از روتینگ‌ها را بخوانیم ( مثلا برای شرکت‌های مختلف به فرض در سایتهای B2B) و نه همه روتینگ‌ها رو چیکار باید بکنیم.
    مطمئنا اگر این مجموعه استاتیک باشد با وارد شدن دو کاربر همزمان با داشتن روتینگ‌های متفاوت ، روتینگ یکی از اونها اشتباه میشه.
    به نظرتون چیکار میشه کرد؟
    • #
      ‫۹ سال و ۳ ماه قبل، چهارشنبه ۳ تیر ۱۳۹۴، ساعت ۱۴:۴۲

      استاتیک بودن ربطی به تغییر ناپذیری (immutable) یک متغیر ندارد. متغیرهای استاتیک mutable هستند. بحث اطلاعات singleton متفاوت هستند با بحث static بودن. هر استاتیکی singleton نیست.

      مسیریابی‌ها در ASP.NET طوری طراحی شدن که یکبار که در application_start برنامه خونده شدن، دیگه قابل تغییر نیستند. این مورد به طراحی این سیستم بر می‌گرده. بنابراین، خوندن اون‌ها در سشن‌های مختلف، هیچ مشکل تداخلی به همراه نداره، چون قرار نیست اینجا اطلاعاتی تغییر کنه. صرف خوندن اطلاعات تغییر ناپذیر، مشکل تداخل تردها رو نداره (یکبار قبلا در application_start کار مقدار دهی اون‌ها انجام و تموم شده).

      ضمنا میشه مسیریابی‌ها رو در زمان اجرا تغییر داد، باید کل سیستم اون یکبار منقضی و بعد ری‌لود بشه: http://haacked.com/archive/2010/01/17/editable-routes.aspx/

      • #
        ‫۹ سال و ۳ ماه قبل، چهارشنبه ۳ تیر ۱۳۹۴، ساعت ۱۸:۳۰
        ممنون؛ ما چند دامین داریم که مربوط به شرکتهای مختلفه و همه اینها به یک اپلیکیشن وبی ارجاع داده می‌شوند منتها به خاطر اینکه ممکنه تعداد شرکتها و اینکه هر شرکت صفحات اختصاصی و بالطبع روتینگ‌های خاص خودش رو داشته باشه، بهتره که فقط روتینگ‌های اون شرکت لود بشوند.
        چیزی که شما می‌فرمایید کاملا درسته و روتینگ یکبار در application_start(این رویداد فقط یکبار در استارت کل پروژه اجرا می‌شود) لود میشه ولی برای این مورد که عرض کردم جوابگو نیست ، چون قراره که هر کاربر با واردشدنش به سایت، ابتدا تشخیص داده بشه برای کدام شرکته و در مرحله بعد روتینگ‌های مختص خودش لود بشوند.
        برای این مورد مثلا میتونیم از Session_Start استفاده کنیم. و همونطور که خودتون هم میدونید متغیرهای استاتیک در کل پروژه ثابت هستند. بنابراین با دستکاری کردن لیست روتینگ‌های شرکت 1 ، روتینگ‌های شرکت 2 هم دستکاری میشه. یعنی کاربر شرکت 1 که در حال کار است با وارد شدن کاربر 2 که از شرکت 2 است، باعث عوض شدن لیست روتینگ‌های شرکت 1 میشه و این مشکل ایجاد میکنه.
        • #
          ‫۹ سال و ۳ ماه قبل، چهارشنبه ۳ تیر ۱۳۹۴، ساعت ۱۸:۵۸

          نمی‌تونید لیست روتینگ‌ها رو در زمان اجرا و پس از start دستکاری کنید (اینطوری طراحی شده). در مورد کار با ساب دومین مطلب در سایت هست: آموزش ساخت و کار با subdomain در حالت لوکال هاست

          ضمنا میشه یک برنامه‌ی asp.net رو در app domainهای جداگانه‌ای اجرا کرد (با تنظیمات مسیریابی جدا و مخصوص هر کدام). برای اینکار فقط کافی هست که یک application pool جداگانه به ازای هر مشتری درست کنید.

  • #
    ‫۹ سال و ۱ ماه قبل، دوشنبه ۲ شهریور ۱۳۹۴، ساعت ۰۹:۱۳
    سلام
    ممنون از مطلب کاملتون ، من کامل انجام دادم فقط یه مشکل دارم . وقتی تو صفحه نمایش خبر هستم رو هر لینکی کلیک میکنم باز تو همون صفحه میمونه و فقط اسم لینک به انتهای url اضافه میشه
     این صفحه خبره  /NewsPage/6/news1/   بعد که میخوام برم صفحه اصلی اینجوری میشه /NewsPage/6/Home/   
    ممنون میشم راهنمایی کنین
    • #
      ‫۹ سال و ۱ ماه قبل، دوشنبه ۲ شهریور ۱۳۹۴، ساعت ۱۷:۲۰
      می توانید به ابتدای هر لینک یک /  اضافه نمایید  و یا اینکه از متد ResolveUrl  استفاده کنید  .
      مثال :
      ResolveUrl("/news/12/newstitle")


  • #
    ‫۸ سال و ۶ ماه قبل، چهارشنبه ۱۹ اسفند ۱۳۹۴، ساعت ۲۳:۴۵
    من قبلا در پروژه هام Url Routing رو انجام دادم و هیچ مشکلی نداشتم ولی تو پروژه جدیدم کار نمیکنه آیا ممکنه که مشکل از ویژوال استودیو باشه (2013)؟
    این ارور ور میده
     The resource cannot be found.
    Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.
    Requested URL: /Service/1/ewr/
    این هم کد‌های کامل
    public static void RegisterRoutes(RouteCollection routes)
    {
       routes.MapPageRoute( "Service" ,  "Service/{ID}/{ProductTitle}" ,  "~/Service.aspx" );
    }
    
    void Application_Start( object sender, EventArgs e)
    {
       RegisterRoutes(RouteTable.Routes); 
    }
     کد لینک
     <asp:HyperLink ID= "HyperLink2" runat= "server" NavigateUrl= '<%# string.Format("/Service/{0}/{1}", Eval("ProductID") ,Eval("ProductTitle").ToString().Replace(" ", "-")) %>' />
     کد صفحه مقصد
    protected void LinqDataSource1_Selecting( object sender, LinqDataSourceSelectEventArgs e)
    {
       int ID =  int .Parse(Page.RouteData.Values[ "ID" ].ToString());
       e.Result = db.Product.Where(p => p.ProductID == ID).FirstOrDefault(); 
    }
    • #
      ‫۸ سال و ۶ ماه قبل، پنجشنبه ۲۰ اسفند ۱۳۹۴، ساعت ۱۲:۲۱
      فایل web.config پروژه‌ای را که کار می‌کند، با پروژه‌ی جدید مقایسه کنید. به طور قطع یک سری از مداخل اجرای http moduleهای مرتبط را در قسمت system.webServer ندارد.