سؤال

أحاول إنشاء قائمة لموقع الويب الخاص بي. يحتاج إلى تلبية المتطلبات التالية

  • يجب أن تكون قاعدة قاعدة البيانات ، وسحب البيانات من DB لإنشاء بنية القائمة
  • يجب أن يتم تخزين البيانات التي يتم سحبها من DB - لا أريد الضغط على DB لكل طلب صفحة

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

انا املك ProductMenuattribute, ، الذي يسحب البيانات من DB ، ويخزنها في ViewData:

public class ProductMenuAttribute: FilterAttribute, IActionFilter
{
    #region IActionFilter Members

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext != null)
        {
            var context = filterContext.Result as ViewResult;
            if (context != null)
            {
                ProductsRepository repository = new ProductsRepository(Properties.Settings.Default.SqlConnectionString);

                context.ViewData.Add("ProductsList", repository.GetAllProductRanges());
            }
        }
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {

    }

    #endregion
}

في site.master أسحب البيانات من عرض البيانات واستخدمها لتقديم قائمتي. هذا مقتطف صغير في قائمة القائمة غير المطلوبة ، والتي يتم تصميمها باستخدام CSS. هنا هو الرمز:

            <li>
                <%= Html.ActionLink("Products", "Index", "Products")%>

                <%  IQueryable<ProductRange> productRanges = ViewData["ProductsList"] as IQueryable<ProductRange>; %>

                    <% if (productRanges != null)
                       { %>

                    <ul>
                        <% foreach (ProductRange range in productRanges) 
                           { %>   
                            <li><%= Html.ActionLink(range.Name, "RangeDetails", "Products", new { id = range.ID }, null)%></li>
                        <% } %>
                    </ul>

                    <% } %>
            </li>

ثم أقوم بتزيين كل وحدة تحكم مع ProductMenu attribuate على النحو التالي:

[ProductMenu]
public class HomeController : BaseController
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

الآن عندما يتم ضرب أي من الإجراءات على وحدة التحكم الخاصة بي ، OnActionExecuted الطريقة في ProductMenuattribute سيتم استدعاء الفصل ، والذي سيقوم بتعيين ViewData ، والذي سيتم استخدامه في النهاية على بلدي site.master لإنشاء قائمتي من DB ، وهو الوقت الذي أسميه أي من الإجراءات.

المشكلة الآن هي - كيف يمكنني إضافة التخزين المؤقت إلى هذا السيناريو ؟؟ ليس لدي أدنى فكرة من أين أبدأ ، ولدي شعور بأن الحل الذي لدي غير قابل للتخطيط.

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

المحلول

أعتقد أن ما أبحث عنه حقًا هو استخدام html.renderaction () تمديد المساعد من مشروع MVC Futures.

تتمثل الفكرة في استخدام ما سبق لاستدعاء إجراء على وحدة تحكم ، والتي ستقوم بإنشاء بنية قائمة HTML عن طريق سحب البيانات من DB. ثم أستخدم أيضًا التخزين المؤقت للإخراج البسيط لتخزين البيانات لبضع دقائق ..

هذا هو أبسط نهج وجدته حتى الآن لتحقيق ما أريد.

تعديل: قام فيل هاك بتدوين هذا مؤخرًا - html.renderaction و html.action. مدونة رائعة تغطي جميع احتياجاتي الدقيقة ، مع تفسيرات لجميع القضايا.

للحصول على التخزين المؤقت للعمل بشكل صحيح ، سأحتاج إلى وضع بلدي Html.RenderAction() اتصل داخل أ ViewUsercontrol مع مجموعة توجيهات الإخراج على النحو التالي:

<@ OutputCache Duration="100" VaryByParam="None" %>

ثم أتصل بما سبق مع Html.RenderPartial(), وفويلا ، كل شيء يعمل!

نصائح أخرى

يمكنك تعديل مستودعك ليكون مدركًا لذاكرة التخزين المؤقت: انظر هذا السؤالين:مستودع مؤقت مؤقت و HTTP ذاكرة التخزين المؤقت.

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

فقط لذكر هذا الرمز للقيام بذلك كان في فئة ثابتة. مثال على ذلك ، لكنني أعيد كتابة هذا التطبيق في MVC2 من نقطة الصفر ، لذلك ليس لدي رمز باليد.

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