سؤال

لدي SearchController مع العمل أن يمكن تنفيذ بعض الطويلة البحث والعودة صفحة النتائج.عمليات البحث يمكن أن تتخذ في أي مكان من 1 إلى 60 ثانية.يكتب عنوان البحث هو طلب HTTP GET من شكل: http://localhost/Search?my=query&is=fancy

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

  1. يمكن للمستخدم تحميل الصفحة دون إعادة تشغيل البحث
  2. مرة واحدة في نهاية البحث الانتهاء, يتم إعادة توجيه المستخدم إلى نتائج
  3. تجربة يحط لمتصفحات مع جافا سكريبت المعوقين
  4. زر العودة / متصفح التاريخ يجب أن لا تشمل هذه الخلالي الصفحة.
  5. في حالة بحث قصيرة (1 ثانية) ، فإنه لا يكون لها تأثير كبير على أي من الوقت للوصول إلى نتائج أو تجربة (كبير القبيح صفحة ومضات, أيا كان)

تلك هي لطيفة إلى أن يكون هو.أنا منفتح على كل الأفكار!شكرا

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

المحلول

يمكنك أن تفعل ذلك بالطريقة التالية:

  • هل طلب بحث (GET url) مع اياكس
  • البحث url لا عودة النتائج ، ولكن يعود بعض Json أو XML المحتوى مع رابط النتائج الفعلية
  • العميل الصفحة يظهر "تحميل..." رسالة في انتظار اياكس الاتصال الى النهاية
  • العميل الصفحة إعادة توجيه إلى صفحة النتائج عند الانتهاء.

مثال باستخدام مسج:

<div id="loading" style="display: none">
  Loading...
</div>
<a href="javascript:void(0);" 
  onclick="searchFor('something')">Search for something</a>

<script type="text/javascript">
  function searchFor(what) {
    $('#loading').fadeIn();
    $.ajax({ 
      type: 'GET', 
      url: 'search?query=' + what, 
      success: function(data) { 
        location.href = data.ResultsUrl; 
      } 
    });        
  }
</script>

(تحرير:)

المراقب سيكون شيئا مثل:

public class SearchController 
{
  public ActionResult Query(string q) 
  {
    Session("searchresults") = performSearch();
    return Json(new { ResultsUrl = 'Results'});
  }

  public ActionResult Results()
  {
    return View(Session("searchresults"));
  }
}

والنظر في ذلك الزائفة رمز:لم أكن في الواقع اختبار.

نصائح أخرى

من أجل إبقائه جافا سكريبت-أقل يمكن تقسيم البحث إلى عدة إجراءات.

أول عمل (/Search/?q=المجرم) فقط لا التحقق من صحة بعض المعلمات الخاص بك (حتى يمكنك معرفة ما إذا كنت بحاجة إلى إعادة عرض النموذج) ثم ترجع الرأي الذي يستخدم الفوقية تحديث إلى نقطة المتصفح إلى "ريال مدريد" البحث عن عمل.

يمكنك تنفيذ هذه مع اثنين من منفصلة تحكم الإجراءات (أقول البحث و النتائج):

public ActionResult Search(string q)
{
    if (Validate(q))
    {
        string resultsUrl = Url.Action("Results", new { q = q });
        return View("ResultsLoading", new ResultsLoadingModel(resultsUrl));
    }
    else
    {
        return ShowSearchForm(...);
    }
}

bool Validate(string q)
{
    // Validate
}

public ActionResult Results(string q)
{
    if (Validate(q))
    {
        // Do Search and return View
    }
    else
    {
        return ShowSearchForm(...);
    }
}

ولكن هذا يعطيك بعض العقبات بقدر ما منعش وغني.حتى تتمكن من إعادة دمجها في عمل واحد التي يمكن الإشارة نفسها من مرحلتين العملية باستخدام TempData.

static string SearchLoadingPageSentKey = "Look at me, I'm a magic string!";

public ActionResult Search(string q)
{
    if (Validate(q))
    {
        if (TempData[SearchLoadingPageSentKey]==null)
        {
            TempData[SearchLoadingPageSentKey] = true;
            string resultsUrl = Url.Action("Search", new { q = q });
            return View("ResultsLoading", new ResultsLoadingModel(resultsUrl));
        }
        else
        {
            // Do actual search here
            return View("SearchResults", model);
        }
    }
    else
    {
        return ShowSearchForm(...);
    }
}

هذا يغطي النقاط 2, 3, 4 و يمكن القول 5.

لتشمل دعم #1 يعني أنك ذاهب لتخزين نتائج البحث إما في الدورة, db, الخ..

في هذه الحالة, فقط إضافة المطلوب ذاكرة التخزين المؤقت implementatin كجزء من "هل الفعلية البحث هنا" ، إضافة الاختيار-ل-مؤقتا-نتيجة لتجاوز تحميل الصفحة.على سبيل المثال

if (TempData[SearchLoadingPageSentKey]==null)

يصبح

if (TempData[SearchLeadingPageSentKey]==null && !SearchCache.ContainsKey(q))

سؤال جيد.قد يكون قريبا لتنفيذ حل مماثل في asp.net mvc نفسي ولكن لا أعتقد أن ذلك يتطلب في الأساس تنفيذ مختلفة من webforms القائم على الحل ، وهناك أمثلة مختلفة على شبكة الإنترنت:

لقد بنيت سابقا التنفيذ على الرابط أعلاه مع نماذج ويب.العملية الأساسية هي:

  1. الصفحة الأولى هو طلب w/ معايير البحث
  2. هذه الصفحة يبدأ موضوع جديد الذي يؤدي طويلة المهمة
  3. هذه الصفحة إعادة توجيه المستخدم إلى "في إطار عملية" الصفحة التي http تحديث رأس مجموعة إلى تحديث كل بضع ثوان
  4. موضوع أداء البحث عن تحديثات "العالمية" ساكنة البحث-التقدم كائن مشيرا إلى % كاملة ، في إطار عملية يقرأ صفحة من ذلك ، وعرض التقدم.(كل بحث يتم تخزينها من قبل معرف GUID في Hashtable حتى المتزامنة متعددة تفتيش معتمدة)
  5. بمجرد إكمال الموضوع التحديثات البحث-التقدم على هذا النحو وعندما إطار عملية صفحة بالكشف عن هذا ، فإنه الموجهات إلى النهائي "نتيجة" صفحة.

(بالتأكيد التحقق من الوصلة الثانية من MSDN, انها مختلفة تماما الحل, ولكن لا أحد أنا فقط قرأت أكثر.)

الاستفادة من هذا هو أنه لا يتطلب جافا سكريبت على الإطلاق.أكبر العيب أن أستطيع التفكير (من وجهة نظر المستخدم) هو أنه ليس تماما "ويب 2.0" و المستخدمين سوف تضطر إلى الانتظار من خلال سلسلة من المتصفح بالتحديث.

شيء على أساس @يان ويليم ب اياكس القائمة على اقتراح أن يكون بديلا صالحا هذا متعددة الخيوط الانتظار نمط الدولة.الذي يلبي الاحتياجات الخاصة بك هو شيء عليك أن تقرر بنفسك.على سبيل المثال من aspfree.com نشرت لي أن تلبي معظم الاحتياجات الخاصة بك على الرغم من العمل فقط كذلك مع MVC كما "نماذج ويب".

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