ASP.NET MVC Paging - هل تريد تمرير الأنواع المعقدة مرة أخرى إلى وحدة التحكم؟

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

  •  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 جديد ببيانات البحث الحالية ثم إضافة مفتاح "الصفحة" بالقيمة الجديدة (يتم الكتابة فوقه إذا كان موجودًا في بيانات البحث).

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