Asp.Net MVC:كيف يمكنني تمكين الشرطات في عناوين URL الخاصة بي؟

StackOverflow https://stackoverflow.com/questions/30310

  •  09-06-2019
  •  | 
  •  

سؤال

أرغب في وضع شرطات منفصلة للكلمات في عناوين URL الخاصة بي.لذا بدلاً من:

/MyController/MyAction

أود أن:

/My-Controller/My-Action

هل هذا ممكن؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام سمة ActionName كما يلي:

[ActionName("My-Action")]
public ActionResult MyAction() {
    return View();
}

لاحظ أنك ستحتاج بعد ذلك إلى استدعاء ملف العرض "My-Action.cshtml" (أو الامتداد المناسب).ستحتاج أيضًا إلى الإشارة إلى "my-action" في أي من طرق Html.ActionLink.

لا يوجد مثل هذا الحل البسيط لوحدات التحكم.

يحرر:التحديث لMVC5

تمكين المسارات عالميًا:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();
    // routes.MapRoute...
}

الآن مع MVC5، تم استيعاب توجيه السمات في المشروع.يمكنك الآن استخدام:

[Route("My-Action")]

حول أساليب العمل.

بالنسبة لوحدات التحكم، يمكنك تطبيق أ RoutePrefix السمة التي سيتم تطبيقها على جميع أساليب العمل في وحدة التحكم تلك:

[RoutePrefix("my-controller")]

واحدة من فوائد الاستخدام RoutePrefix سيتم أيضًا تمرير معلمات URL إلى أي طرق عمل.

[RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller .....

قص..

[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client

نصائح أخرى

يمكنك إنشاء معالج مسار مخصص كما هو موضح في هذه المدونة:

http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/

public class HyphenatedRouteHandler : MvcRouteHandler{
        protected override IHttpHandler  GetHttpHandler(RequestContext requestContext)
        {
            requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
            requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
            return base.GetHttpHandler(requestContext);
        }
    }

...والطريق الجديد:

routes.Add(
            new Route("{controller}/{action}/{id}", 
                new RouteValueDictionary(
                    new { controller = "Default", action = "Index", id = "" }),
                    new HyphenatedRouteHandler())
        );

تم طرح سؤال مشابه جدًا هنا: دعم ASP.net MVC لعناوين URL ذات الواصلات

لقد قمت بتطوير مصدر مفتوح مكتبة نوجيت لهذه المشكلة التي تقوم ضمنيًا بتحويل EveryMvc/Url إلى every-mvc/url.

تمثل عناوين URL ذات الأحرف الكبيرة مشكلة لأن مسارات ملفات تعريف الارتباط حساسة لحالة الأحرف، ومعظم الإنترنت في الواقع حساس لحالة الأحرف بينما تتعامل تقنيات Microsoft مع عناوين URL على أنها غير حساسة لحالة الأحرف.(المزيد عن مدونتي)

حزمة نوجيت: https://www.nuget.org/packages/LowercaseDashedRoute/

لتثبيته، ما عليك سوى فتح نافذة NuGet في Visual Studio عن طريق النقر بزر الماوس الأيمن فوق المشروع واختيار NuGet Package Manager، وفي علامة التبويب "Online"، اكتب "Lowercase Dashed Route"، ويجب أن يظهر.

وبدلاً من ذلك، يمكنك تشغيل هذا الرمز في وحدة تحكم إدارة الحزم:

Install-Package LowercaseDashedRoute

بعد ذلك، يجب عليك فتح App_Start/RouteConfig.cs والتعليق على استدعاء Route.MapRoute(...) الموجود وإضافة هذا بدلاً من ذلك:

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}",
  new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
    new DashedRouteHandler()
  )
);

هذا كل شيء.جميع عناوين URL تكون بأحرف صغيرة ومتقطعة ومحولة ضمنيًا دون أن تفعل أي شيء آخر.

عنوان URL للمشروع مفتوح المصدر: https://github.com/AtaS/lowercase-dashed-route

إليك ما فعلته باستخدام المناطق في ASP.NET MVC 5 وقد نجح الأمر بشكل رائع.ولم أضطر إلى إعادة تسمية وجهات نظري أيضًا.

في RouteConfig.cs، قم بما يلي:

 public static void RegisterRoutes(RouteCollection routes)
    {
        // add these to enable attribute routing and lowercase urls, if desired
        routes.MapMvcAttributeRoutes();
        routes.LowercaseUrls = true;

        // routes.MapRoute...
    }

في وحدة التحكم الخاصة بك، قم بإضافة هذا قبل تعريف الفئة الخاصة بك:

[RouteArea("SampleArea", AreaPrefix = "sample-area")]
[Route("{action}")]
public class SampleAreaController: Controller
{
    // ...

    [Route("my-action")]
    public ViewResult MyAction()
    {
        // do something useful
    }
}

عنوان URL الذي يظهر في المتصفح في حالة الاختبار على الجهاز المحلي هو: المضيف المحلي/منطقة العينة/my-action.لا تحتاج إلى إعادة تسمية ملفات العرض الخاصة بك أو أي شيء.كنت سعيدًا جدًا بالنتيجة النهائية.

بعد تمكين سمات التوجيه، يمكنك حذف أي ملفات تسجيل منطقة لديك مثل SampleAreaRegistration.cs.

هذا شرط ساعدني في التوصل إلى هذا الاستنتاج.آمل أن يكون مفيدا لك.

سيدعم Asp.Net MVC 5 توجيه السمات، مما يسمح بتحكم أكثر وضوحًا في أسماء المسارات.سيبدو استخدام العينة كما يلي:

[RoutePrefix("dogs-and-cats")]
public class DogsAndCatsController : Controller
{
    [HttpGet("living-together")]
    public ViewResult LivingTogether() { ... }

    [HttpPost("mass-hysteria")]
    public ViewResult MassHysteria() { }
}

للحصول على هذا السلوك للمشاريع التي تستخدم Asp.Net MVC قبل الإصدار 5، يمكن العثور على وظائف مماثلة باستخدام مشروع توجيه السمات (أيضًا متاح ك nuget).في الواقع، تواصلت Microsoft مع مؤلف AttributeRouting لمساعدته في تنفيذ MVC 5.

يمكنك كتابة مسار مخصص مشتق من فئة المسار GetRouteData لإزالة الشرطات، ولكن عند استدعاء واجهات برمجة التطبيقات لإنشاء عنوان URL، سيتعين عليك أن تتذكر تضمين الشرطات لاسم الإجراء واسم وحدة التحكم.

لا ينبغي أن يكون ذلك صعبا للغاية.

يمكنك تحديد مسار معين مثل:

routes.MapRoute(
    "TandC", // Route controllerName
    "CommonPath/{controller}/Terms-and-Conditions", // URL with parameters
    new {
        controller = "Home",
        action = "Terms_and_Conditions"
    } // Parameter defaults
);

ولكن هذا الطريق يجب أن يتم تسجيله قبل المسار الافتراضي الخاص بك.

إذا كان لديك حق الوصول إلى وحدة إعادة كتابة عنوان URL لـ IIS ( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx )، يمكنك ببساطة إعادة كتابة عناوين URL.

يمكن إعادة كتابة الطلبات المقدمة إلى /my-controller/my-action إلى /mycontroller/myaction ومن ثم ليست هناك حاجة لكتابة معالجات مخصصة أو أي شيء آخر.يحصل الزائرون على عناوين URL جميلة وتحصل على عناوين URL التي يمكن لـ MVC فهمها.

فيما يلي مثال لوحدة تحكم وإجراء واحد، ولكن يمكنك تعديل هذا ليكون حلاً أكثر عمومية:

<rewrite>
  <rules>
    <rule name="Dashes, damnit">
      <match url="^my-controller(.*)" />
      <action type="Rewrite" url="MyController/Index{R:1}" />
    </rule>
  </rules>
</rewrite>

الجانب السلبي المحتمل لذلك هو أنه سيتعين عليك تبديل مشروعك لاستخدام IIS Express أو IIS لإعادة الكتابة للعمل أثناء التطوير.

ما زلت جديدًا جدًا على MVC، لذا تعامل مع الأمر بحذر.إنه ليس حلاً أنيقًا وشاملاً ولكنه كان بمثابة الحيلة بالنسبة لي في MVC4:

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top