يتعذر على ASP.NET MVC العثور على المسار برمجيًا
-
07-07-2019 - |
سؤال
لدي المسار التالي، المسجل في ملفي global.asax.
routes.MapRoute(
"Home", // Unique name
"", // Root url
new { controller = "Home", action = "Index",
tag = string.Empty, page = 1 }
);
kewl.عندما أبدأ تشغيل الموقع، فإنه يلتقط هذا المسار بشكل صحيح.
الآن، عندما أحاول القيام بما يلي برمجيًا، فإنه يُرجع NULL.
var pageLinkValueDictionary =
new RouteValueDictionar(linkWithoutPageValuesDictionary)
{{"page", 2}};
VirtualPathData virtualPathData =
RouteTable.Routes.GetVirtualPath(viewContext, "Home"
pageLinkValueDictionary);
// NOTE: pageLinkValueDictionary ==
// Key: Action, Value: Index; Key: page, Value: 2
لماذا ممكن ان يحصل هذا؟
كان لدي انطباع بأنه سيجد المسار الرئيسي ولكنه سيضيف أي قيم لم يتم العثور عليها كعناصر سلسلة استعلام؟
تحديث
لا يوجد حتى الآن الحظ مع هذا.وأيضا باستخدام إم في سي آر سي, ، أنا الآن بحاجة إلى تغيير viewContext إلى veiwContext.RequestContext ..الذي يجمع ولكن ما زلت أحصل على نتيجة فارغة.
تحديث 2
عندما يكون لدي الطريق دون page=1
العنصر الافتراضي، الطريق وجد.على سبيل المثال.
routes.MapRoute(
"Home",
"",
new { controller = "Post", action = "Index", tags = string.Empty }
);
..و RouteTable.Routes.GetVirtualPath
يعود أ VirtualPathData
مثال.عندما أقوم بإضافة page=1
(القيمة الافتراضية) مرة أخرى، VirtualPathData
المثيل الذي تم إرجاعه فارغ؟
المحلول
حسنًا، سبب إرجاعها فارغًا هو عدم وجود مسار يحتوي على بيانات مسار "الصفحة".
هل يمكنك التوسع قليلاً في ما تحاول تحقيقه؟إذا كنت تريد إعادة التوجيه إلى صفحة بعنوان url /page/2 أو /?page=2 ، فيجب عليك استخدام RedirectToRoute أو RedirectToAction:
return RedirectToRoute("IndexDefault", new {page = "2"});
نصائح أخرى
أعتقد أن طريقك يجب أن يكون هكذا:
route.MapRoute("theRoute", "{controller}/{action}/{tag}/{page}",
new { controller="Post", action="Index", tag="", page=1 });
أو (اعتمادًا على الشكل الذي يجب أن يبدو عليه عنوان URL الكامل)...
route.MapRoute("theRoute", "/{tag}/{page}",
new { controller="Post", action="Index", tag="", page=1 });
سيظل هذا مطابقًا لطلب http://mysite.com/ وانتقل إلى قيم المسار الافتراضية المحددة أعلاه.ولكن الآن عند تحديد علامة أو صفحة، ستحصل على عنوان URL الذي تريده.
يجب عليك التحقق من اختبار طريق Phil: