مسارات مخصصة لـ ASP.NET MVC مع وسيطات اختيارية
-
05-07-2019 - |
سؤال
أريد طريقًا يحتوي على وسيطتين اختياريتين؛اعتقدت أن ما يلي سيعمل:
routes.MapRoute(
"ProductForm",
"products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "", category_id = "" },
new { action = @"Create|Edit" }
);
لكنه لا يعمل إلا عندما يكون كلاهما vendor_id
و category_id
تم تقديمة؛استخدام RouteDebug
أرى ذلك /products/create/_3
لا يؤدي إلى تشغيل مساري، لذا أضفت طريقين آخرين:
routes.MapRoute(
"ProductForm1",
"{controller}/{action}/_{category_id}",
new { controller = "Home", action = "Index", category_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
routes.MapRoute(
"ProductForm2",
"{controller}/{action}/{vendor_id}_",
new { controller = "Home", action = "Index", vendor_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
إذن الأسئلة:
هل استخدام ثلاثة مسارات هو الطريقة الوحيدة لإنشاء مسار باستخدام وسيطات اختيارية؟
هل عناوين URL هذه جيدة أم لا، أي هل تقترح طريقة أفضل للقيام بذلك؟
المحلول
لماذا لا تحاول إعطاء sales_id قيمة افتراضية (إذا لم يتم تحديدها على سبيل المثال 0) والتي من شأنها أن تساعدك على الابتعاد عن طريق واحد
routes.MapRoute("ProductForm","products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "0", category_id = "" },
new { action = @"Create|Edit" });
نصائح أخرى
يبدو جيدًا بالنسبة لي ولكني سأفعل ذلك بشكل مختلف قليلاً:
routes.MapRoute(
"ProductForm1",
"product/category/{category_id}",
new { controller = "Home", action = "Index", category_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
وثم
routes.MapRoute(
"ProductForm1",
"product/details/{product_id}",
new { controller = "Home", action = "Index", product_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
ثم يمكن أن يكون صفك كما يلي:
ActionResults Index(){}
ActionResults Index(int category_id){// get categories}
ActionResults Index(int product_id){ // get products}
ولكن هذا أنا فقط
يمكنك تجربتها على هذا النحو:
routes.MapRoute(
"ProductForm",
"products/{action}/{arg1}/{arg1_id}/{arg2}/{arg2_id}",
new { controller = "Products", action = "Index", arg1 = "", arg2 = "", arg1_id = "", arg2_id = "" },
new { action = @"Create|Edit" });
ثم ستقوم بإنشاء بعض المنطق في طريقة actionresult الخاصة بك للتحقق من arg1 و arg2 وتحديد الوسيطة التي تم تمريرها.
ستبدو عناوين URL الخاصة برابط الإجراء كما يلي:
/products/create/vendor/10
/products/create/category/20
/products/create/vendor/10/category/20
/products/create/category/20/vendor/10
أنا شخصياً لا أحب هذا لأن الطريق لا يبدو نظيفًا للغاية ولكن هل يجب أن أعطيك ما أعتقد أنك تتطلع إلى تحقيقه؟