سؤال

أريد طريقًا يحتوي على وسيطتين اختياريتين؛اعتقدت أن ما يلي سيعمل:

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

أنا شخصياً لا أحب هذا لأن الطريق لا يبدو نظيفًا للغاية ولكن هل يجب أن أعطيك ما أعتقد أنك تتطلع إلى تحقيقه؟

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