سؤال

كنت أشاهد مجرد عرض Scott Hanselman على ASP.NET MVC في سان فرانسيسكو. بعد التفكير في الأمر لفترة من الوقت ، شعرت بالذهول بشأن أفضل طريقة لأقصى طريقة بناء موقع قائم على ASP.NET MVC يحتوي على بنية [Portal | Modular | Multi-View] (اختر تعريفك المفضل).

لإعطائك فكرة عما أنا بعده ، تقوم شركتي ببناء الكثير من التطبيقات على غرار البوابة للعملاء الخارجيين الذين يتضمنون وحدة رسم الخرائط التي يمكنها الاستجابة لسلاسل الاستعلام والطرق الخاصة بها ، ووحدة معلومات الطرود الضريبية التي لديها بالمثل لها خاصة بها عرض (عرض) ، عرض استرجاع المستندات الذي يعرض مستندات واحدة ومتعددة ... تحصل على الفكرة. الجزء الحاسم هو أن كل وحدة مستقلة حقًا. إذا بحث المستخدم عن سجل ضريبي بالاسم ، فقد يرون 10 نتائج ("John Doe" يمتلك بعض الخصائص). تحتوي كل نتيجة على رابط "Map It" لأن إطار تطبيق موقع الويب يعلم أن هناك وحدة خريطة متاحة. يرسل رابط "Map It" الطلب الصحيح مثل http://myapp.com/taxparcel/map/123443. يستجيب وحدة التحكم في وحدة الخريطة للطلب الخارجي عن طريق التكبير على الخريطة وتسليط الضوء على الطرود الضريبية.

مفتاح هذا التدفق كله هو ذلك على حد سواء وحدات الضريبة والتعيين موجودة على نفس صفحة الويب.

فكيف يتناسب ذلك مع مربع ASP.NET MVC؟ الجزئية؟ وجهات النظر الفرعية؟ طرق عرض متعددة لوحدة تحكم واحدة؟ إذا فقدت الجزء الواضح من الوثائق الواضحة ، فلا تتردد في صياغتي علنًا وتضمين الرابط. وإلا فأنا منفتح على نطاق واسع على الاقتراحات.

هل كانت مفيدة؟

المحلول

حسنًا ، يحتاج نموذج العرض الخاص بك إلى توفير نقاط تمديد. أفترض أن بيانات العرض تحتوي على أجزاء الوحدة النمطية هذه ، ويتم اختيارها بواسطة وحدة التحكم بطريقة ما:

public ActionResult Search(string text)
{
   var model = seachService.Search(text)
   // here either:
   // 1. model contains .Modules collection and is populated by the service, or
   // 2. controller does
   var viewmodel = new SearchViewModel(model, modulesService.GetModulesFor(model));
   // i.e. it adds modules-specific information to the view data
   return View(model);
}

الآن ، يتم تحويل البيانات الخاصة بالوحدات النمطية بواسطة SearchViewModel إلى شيء يمكن استخدامه:

public interface IModuleSpecificViewPart
{
  public IList<string> GetAdditionalLinksForUser();
  public void RenderAdditionalInfo(Response response);
}

ورأيك يفعل

<%= Model.Results[i] %>
<% foreach (var module in Model.ModuleSpecific) { %> 
<a href="<%=module.AdditionalLink%>">More</a> 
<% module.RenderAdditionalInfo(Response); %>
<% } %>

يمكن أن يوفر نموذج عرض الوحدة النمطية اسم عرض جزئي ، وما إلى ذلك. لاحظ أنه وحدات. التقاط تلقائيًا فئة نموذج عرض الوحدة النمطية المحددة.

هذه هي الفكرة. يمكن أن أفهم أن سؤالك خاطئ تمامًا - آسف إذا كان الأمر كذلك.

نصيحة واحدة ، وجدت شخصيا أنه إذا حاولت أن أكون عاما للغاية ، فإنه يضيف مضاعفات غير ضرورية للمشروع (حتى أنا حتى كتب حوله). أي نعم ، وحداتك غير معروفة في وقت الترجمة ولكن عليك أن تعرف شيئًا عنها! قد يضيفون رابطًا إلى نتيجة البحث - إليك نقطة التمديد لذلك. لا يمكن للمرء أن يتصور نقاط التمديد لـ "أي شيء" ، لذا ستحتاج أولاً إلى سرد حالاتك المحددة.

نصائح أخرى

أعتقد أن رد Queen3 أكثر ملاءمة لمشكلتك المحددة ، لكنني اعتقدت أنني سأقوم بنشر أفكاري حول المسألة العامة على أي حال.

أنا أفكر في القيام بشيء مماثل باستخدام التقنيات التي تمت مناقشتها في ماثيو أبوتمشاركة مدونة. باستخدام MEF ، يمكنك فقط إسقاط DLL جديد في بوابةك لتنشيط وحدة نمطية.

وجود وحدات متعددة على صفحة واحدة أمر صعب بعض الشيء. RenderPartial يمكن أن يعمل ولكن هذا يعني بشكل عام إضافة رمز يعمل على نفس نموذج العرض. RenderAction من ناحية أخرى ، يستخدم وحدة التحكم والنموذج الخاص بها. عمومًا لا أفضل استخدام RenderAction في أي سيناريو آخر لأنه ينكسر أو على الأقل يقود نمط MVC. ومع ذلك ، في هذه الحالة ، سيتم استخدامه فقط على صفحة واحدة مسؤولة عن وضع وحدات متعددة. يمكن أن تكون جميع الإضافات الخاصة بك طرق عرض MVC ووحدات التحكم والنماذج العادية.

التفاصيل على RenderAction يمكن ايجاده هنا.

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