كيف يمكنني إنشاء مسار يقوم بإرجاع عنوان URL دون مرجع تحكم في ASP.NET MVC

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

سؤال

لدي Controller Call DefaultController. داخل وحدة التحكم هذه لدي آراء لما سيكون يعادل الصفحات الثابتة.

تبدو عناوين URL مثل www.site.com/default/pagename

هل من الممكن إنشاء طريق يقوم بتنسيق عنوان URL هذا مثل:

www.site.com/pagename.

أريد تجنب إنشاء وحدات تحكم لكل منها. سيكون بديلا لإنشاء صفحات .aspx في الجذر ولكن يمكنني إنشاء طرق لهذه الصفحات IE:

www.site.com/pagename.aspx يصبح www.site.com/pagename؟

شكرًا!

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

المحلول

يمكنك إنشاء طريق صريح ل PageName العمل على DefaultController مثله:

routes.MapRoute(
    "PageName",
    "pagename",
    new { controller = "DefaultController", action = "PageName" }
);

يجب عليك وضع هذا المسار قبل طريق MVC الافتراضي. أكبر عيب لهذا النهج هو أنه يجب عليك إنشاء طريق واحد لكل صفحة ثابتة.

سيكون نهج بديل هو إضافة طريق إضافي بعد مسار MVC الافتراضي:

routes.MapRoute(
    "DefaultController",
    "{page}/{*path}",
    new { controller = "DefaultController", action = "{page}" }
);

العيب لهذا النهج هو أن هذه القاعدة ستتعامل مع جميع عناوين URL، حتى تلك التي من شأنها أن تعود عادة 404.

نصائح أخرى

النهج الأول

قم بإنشاء طريق يمسك الإجراءات:

routes.MapRoute(
    "Catcher1",
    "{action}",
    new { controller = "Default", action = string.Empty });

ولكن هذا يعني أنك يجب عليك إنشاء العديد من إجراءات التحكم في وحدة التحكم الافتراضية.

النهج الثاني

إذا كنت ترغب في تجنب ذلك أيضا ولديك تحكم واحد فقط + إجراء بدلا من ذلك، اكتب طريقا بهذه الطريقة:

routes.MapRoute(
    "Catcher2",
    "{path}",
    new { controller = "Default", action = "PageName", path = string.Emtpy },
    new { path = @"[a-zA-Z0-9]+" });

يحدد هذا الطريق أيضا قيود المسار بحيث يسقط هذه الطرق فقط، التي لديها بالفعل شيء في قطاع الطرق الأول. يمكنك تحديد هذا القيد لالتقاط تلك الطلبات التي تحتاجها (أي. path = "Result|Search|Whatever")

ثم الخاص بك DefaultController سيكون لديك شيء مثل هذا:

public ActionResult PageName(string path)
{
    // code goes here
}

يبدو أن النهج الثاني ممكنا للغاية، لكنني لن أوصي بذلك لأن جميع المنطق سيتعين علي الذهاب من خلال إجراء وحدة التحكم هذه (لهذا النوع من الطلبات). سيكون من الأفضل فصل هذه الإجراءات في تلك المنطقية. تلك التي تفعل في الواقع نفس الشيء (لذلك لن يكون لديهم مجموعة من switch سيتم تعريف البيانات أو ما شابه ذلك) بطرق منفصلة (إذا لم تتمكن من القيام بها باستخدام واحد واحد).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top