طريقة ذكية للتعامل مع عناوين URL المرتجعة في بيئة MVC

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

  •  29-10-2019
  •  | 
  •  

سؤال

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

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

http://blah.com/account/edit/1?returnURL="account/index"

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

http://blah.com/account/edit/1?returnURL="account/index?search="searchTerm""

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

إن مجرد استدعاء وظيفة الرجوع للمتصفح ليس كافيًا أيضًا، لأنك قد ترغب في تحديث الصفحة، على سبيل المثال.لإظهار التعديلات التي قمت بحفظها للتو في الصفحة السابقة.

لذا سؤالي هو، هل وجد أي شخص طريقة ذكية للتعامل مع هذا النوع من المواقف، وتحديدًا في بيئة MVC؟

ملحوظة:أنا أستخدم ASP .NET MVC لذا، إذا أمكن، أود الحصول على إجابات تتعلق بذلك، ولكن نرحب بأي أفكار.

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

المحلول

ما الخطأ في تعيين ملف تعريف الارتباط، أو استخدام متغير الجلسة؟السبب الوحيد الذي يمنعك من ذلك هو عدم التحكم في الصفحة التي تتصل بك، وفي هذه الحالة تكون خياراتك الوحيدة هي سلاسل الاستعلام، أو قيم النشر، أو المُحيل.

نصائح أخرى

اعتقدت أنني قد أضيف إجابتي إلى السؤال لمعرفة ما إذا كان الآخرون يعتقدون أنها فكرة جيدة.

أنا ببساطة أقوم بتمريرها إلى وحدة التحكم باستخدام TempViewData:

@{
   TempData["returnURL"] = Request.Url.AbsoluteUri;
}

ثم الوصول إليه بطريقة مشابهة لهذه (في نسختي الحقيقية أتحقق من وجود المفتاح TempData وأن returnURL هو عنوان URL حقيقي):

return Redirect(TempData["returnURL"].ToString());

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

TempData["returnURL"] = TempData["returnURL"];

تحقق من منشور مدونتي عليه: استخدام ملفات تعريف الارتباط للتحكم في صفحة العودة بعد تسجيل الدخول على asp.net mvc 3

تمامًا كما ذكر @Mystere Man، يمكنك فقط استخدام ملف تعريف الارتباط أو الجلسة لذلك.لقد ذهبت للحصول على ملفات تعريف الارتباط مرة أخرى عندما واجهت موقفًا مشابهًا منذ فترة.

حاول تسجيل مسار جديد يكون عنوان url الخاص به /{controller}/{action}/{id}/returnurl/{*url} ثم استخدم أ RedirectToAction في الفعل الذي يقبل عنوان URL كمعلمة

Request.UrlReferrer.AbsoluteUri

على الرغم من أنني ما زلت أزعم أنه لا ينبغي عليك إنشاء زر "الرجوع" الخاص بك.

استخدم اعتراضًا أو جانبًا:

  1. اعتراض كل طلب بطريقة ما (على سبيل المثال، أ @Before الجانب) واحفظ عنوان URL المطلوب للجلسة، مع الكتابة فوقه في كل مرة
  2. في طبقة العرض الخاصة بك، قم بالوصول إلى كائن الجلسة هذا حسب الحاجة، في حالتك للرابط الخلفي.

يتيح لك هذا النوع من التصميم أن يكون لديك دائمًا أحدث طلب متاح إذا كنت تريد استخدامه. هنا مثال لكتابة جانب/معترض في .NET.بالإضافة إلى ذلك، بوستشارب هو مشروع جانبي .NET.

في الوقت الحاضر، استعصت علي طريقة سريعة وقذرة...لذلك أنا أستخدم طريقة عملية.

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

مثال:

وقد زار Foo, ، انا ذاهب الى Bar لعرض بعض الأشياء، ويجب أن يعود زر الرجوع إلى Foo.

مراقب

public ActionResult Foo(string fooId) // using a string for your Id, good idea; Encryption, even better.
{
    FooModel model = new FooModel() { fooId = fooId }; // property is passed to the Model - important.
    model.Fill();
    return View("FooView", model);
}

public ActionResult Bar(string fooId, string barId)
{
    BarModel model = new BarModel() { fooId = fooId; barId = barId };
    model.Fill()
    return View("BarView", model)
}

ViewModels

public class FooModel
{
    public string fooId { get; set; }

    public void Fill()
    {
        // Get info from Repository.
    }
}

public class BarModel
{
    public string fooId { get; set; }
    public string barId { get; set; }

    public void Fill()
    {
        // Get info from Repository.
    }
}

عرض (جزئي) // No pun intended... or maybe it was. :)

يمكن الآن لـ BarView الخاص بك أن يفسر من نموذجه حيث يحتاج إلى العودة إلى (باستخدام fooId).

على BarView الخاص بك (باستخدام بناء جملة MVC2):

<a href="<%= string.Format("/Foo?fooId={0}", Model.fooId) %>">Back</a>

يمكنك استخدام Html.ActionLink كذلك.

بدلاً عن ذلك:

يمكنك وراثة ViewModels الخاصة بك من BaseViewModel، والذي يمكن أن يكون له خاصية محمية returnURL.اضبط هذا عند الضرورة.

مثال:

على نموذج العرض الخاص بك:

public class BarModel : BaseViewModel
{
    public string fooId { get; set; }
    public string barId { get; set; }

    public void Fill()
    {
        returnURL = string.Format("/Foo?fooId={0}", fooId)
        // Get info from Repository.
    }
}

على وجهة نظر:

<a href="<%=returnURL %>">Back</a>

هل سيتم التعامل مع هذا بشكل أفضل من خلال الإجراءات الجزئية التي يتم عرضها دون مغادرة الصفحة واستخدام JQuery لإنشاء سير عمل حوار/معالج؟

ثم ما عليك سوى الرد على زر "إنهاء" في مربع الحوار لتحديث العرض الأصلي.

بالنسبة للجزء من سؤالك المتعلق بـ "حفظ السجل الذي يقومون بتحريره"، أعتقد أن نمط الحصول على ما بعد إعادة التوجيه (PGR) سينطبق عليك.

قد يكون هذا مكانًا جيدًا للقراءة عنه إذا لم تكن على دراية به.

  1. قم بتشفير returnUrl باستخدام Url.Encode(returnUrl) لتضمينها في عنوان URL.
  2. عندما تكون جاهزًا لإعادة التوجيه، استخدم Url.Decode(returnUrl) واستخدم القيمة لإعادة التوجيه الفعلية.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top