ASP.NET MVC Paging - هل تريد تمرير الأنواع المعقدة مرة أخرى إلى وحدة التحكم؟
-
05-07-2019 - |
سؤال
أعمل حاليًا على تطبيق MVC بسيط إلى حد معقول يسمح للمستخدم بإدخال بعض بيانات البحث، والحصول على قائمة بالنتائج، ثم عرض كل عنصر وما إلى ذلك.كل شيء يسير بشكل جيد إلى حد ما، لكنني أحاول الآن تنفيذ الترحيل ولكن أواجه بعض المشاكل.
يستخدم نموذج البحث الخاص بي HTTP GET، ويطلب الإجراء التالي:
public ActionResult Results(PropertySearchData data, int? page)
{
...
IEnumerable<Property> search = mService.SearchProperties(data);
ViewData["SearchData"] = data;
return View("Results", "Site", search.ToPagedList(page ?? 0, 20));
...
}
من هنا أقوم ببناء جدول النتائج الخاص بي من مجموعة IEnumerable التي تم تمريرها إلى وجهة نظري.بالإضافة إلى ذلك، استخدمت ViewData للاحتفاظ بمعلمات البحث حتى أتمكن من تمريرها عندما يطلب المستخدم صفحة مختلفة.
على سبيل المثال، للوصول إلى الصفحة الأولى، أود استخدام شيء مثل هذا:
Html.ActionLink("First", "Results", new { data = ViewData["SearchData"], page = 1 })
ومع ذلك، عندما يتم إنشاء هذا الرابط، يكون الرابط الخاص بي على غرار
/Results?data=PropertySearchData&page=1
إذا قمت بإزالة معلمة "الصفحة" بالكامل، وقمت فقط بتمرير ViewData["SearchData"] كقيمة المسار الخاص بي، فسيتم إنشاء الرابط الخاص بي بالطريقة التي أريدها (على سبيل المثال، يتم تمرير كل عضو في PropertySearchData كسلسلة استعلام من خلال ربط النموذج ميزة.أعتقد أن السبب في ذلك هو أن ربط النموذج لا يمكن أن يعمل بشكل صحيح إلا عندما تحدد نوعًا واحدًا؟
أستطيع أن أرى عدة أسباب لعدم نجاح ذلك؛ما أواجه مشكلة فيه هو إيجاد طريقة "لطيفة" لفعل ما أحاول القيام به.أعلم أنني لا بد أن أفتقر إلى جزء حيوي من الفهم هنا، لذا سيكون من دواعي تقديري الكبير أن أحصل على بعض الإرشادات حول كيفية التعامل مع هذا الأمر.
لاحظ أنني أريد حقًا الالتزام بـ HTTP GET (نظرًا لأن هذه صفحة نتائج بحث).
شكرًا!
المحلول
والمشكلة تكمن في طريقة المساعد هو مجرد محاولة فمن الأفضل لتوليد شيء من ما كنت قد أعطيت وهذا هو كائن مع خاصيتين: البيانات وصفحة
.لتحصل على رقم الصفحة في هل يمكن الاستفادة من القاموس القيمة الطريق (الذي هو على الارجح ما فعلته تحت غطاء محرك السيارة على أي حال) والاستفادة من التجاوز أن يقبل IDictionary: -
//In some HtmlHelper extension method or something
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]);
searchCriteria.Add("page", 1);
return Html.ActionLink("First", "Results", searchCriteria)
نصائح أخرى
ومنذ data
أو ViewData["SearchData"]
في مثيل PropertySearchData
انا التخمين أن Html.ActionLink
تدعو ToString()
عليه ولا تعطي النتيجة التي تتوقعها.
لن يكون إنشاء طريقة ملحق HtmlHelper هو أفضل طريقة لحل هذه المشكلة.لن يضيف وظائف عامة، بل المزيد من الفوضى (المرئية) ...
يتوقع التحميل الزائد لـ RouteValues لـ Html.ActionLink كائنًا أو RouteValueCollection (IDictionary).أنت الآن تستخدم التحميل الزائد للكائن (نظرًا لأن المُنشئ {} الجديد هو كائن مجهول).
يمكنك استخدام ما يلي لإنشاء معلمة RouteValues الصحيحة:
new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } }
يؤدي هذا إلى تهيئة RouteValueCollection جديد ببيانات البحث الحالية ثم إضافة مفتاح "الصفحة" بالقيمة الجديدة (يتم الكتابة فوقه إذا كان موجودًا في بيانات البحث).