كيف يمكنني إعادة بناء عنوان URL/المسار في ASP.NET MVC من البيانات المحفوظة؟

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

سؤال

إن عدم معرفتي بإطار عمل ASP.NET MVC والسباكة الخاصة به أوصلني إلى هنا، وأنا أقدر الصبر الذي سيستغرقه أي شخص لقراءة سؤالي والتفكير فيه!

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

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

تتوفر جميع هذه التقارير المحفوظة في قائمة واحدة، تعرض الاسم والوصف، في صفحة معينة في التطبيق، مع ربط كل منها بعنوان URL عام، مثل "/Reports/Saved/248" (حيث يعد 248 مثالاً على معرف التقرير).

هذا هو الجزء الذي أحتاج إلى المساعدة فيه:

عندما أصل إلى الإجراء عبر عنوان url "/Reports/Saved/248" وأقوم بسحب البيانات التعريفية من قاعدة البيانات الخاصة بهذا التقرير المحدد، كيف يمكنني إعادة توجيه تلك البيانات والطلب إلى نفس الإجراء ووحدة التحكم والمسار المستخدم للعرض وجهة النظر التي تم حفظ التقرير منها في الأصل؟بشكل أساسي، أريد أن يعرض المستخدم التقرير في نفس طريقة العرض، وبنفس عنوان URL الذي تم حفظه منه.إذا كان ذلك ممكنًا، سيكون من الجيد بالنسبة لي أن أتمكن من "استدعاء" نفس الإجراء بشكل أساسي كما لو كنت أقوم باستدعاء طريقة.


تحديث:لسوء الحظ، صفحات تقريرنا (أي.الصفحات التي تظهر عليها هذه الشبكات) لا تستخدم عناوين URL RESTful - على سبيل المثال، لدينا ما نسميه صفحة البحث المتقدم، والتي تأخذ عددًا كبيرًا من المعلمات المحتملة (حوالي 30) التي تأتي من نموذج يحتوي على قوائم تحديد، ومربعات نص، إلخ.عندما يرسل المستخدم تلك الصفحة، نقوم بإجراء POST لإجراء يقبل نوعًا معقدًا ينشئه رابط النموذج لنا - وهذا الإجراء نفسه هو ما أريد الاتصال به عندما يحدد المستخدم بحثًا متقدمًا محفوظًا من قاعدة البيانات.هذا المثال يلخص مشكلتي.

شكرًا

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

المحلول

أعتقد أنك ستحتاج إلى استخدام RedirectToAction مع التوقيع الذي يأخذ RouteValueDictionary.يجب أن تكون الطريقة التي تعيد التوجيه إليها قادرة على سحب القيم من ValueProvider على وحدة التحكم.قد يبدو الأمر مثل:

public ActionResult Saved( int id )
{
    var reportParams = db.Reports.SingleOrDefault( r => r.ID == id );
    if (reportParams == null)
       ...handle error...

    var routeValues = ParamsToRouteValueDictionary( reportParams );

    return RedirectToAction( reportParams.Action, reportParams.Controller, routeValues );
}

private RouteValueDictionary ParamsToRouteValueDictionary( object parameters )
{
     var values = new RouteValueDictionary();
     var properties = parameters.GetType().GetProperties()
                                .Where( p => p.Name != "Action" && p.Name != "Controller" );
     foreach (var prop in properties)
     {
         values.Add( prop.Name, prop.GetValue(parameters,null) );
     }

     return values;
}

يحرر

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

 [ActionName("People")]
 [AcceptVerbs( HttpVerbs.Get )]
 public ActionResult PeopleDisplay( SearchModel filter )
 {
     return People( filter );
 }

 [AcceptVerbs( HttpVerbs.Post)]
 [ValidateAntiForgeryToken]
 public ActionResult People( SearchModel filter )
 {
     ....
 }

بعد ذلك، يمكنك تخزين معلمات التصفية (بالاسم)، والإجراء ("الأشخاص")، ووحدة التحكم في قاعدة البيانات الخاصة بك للتقرير.ستستخدم نتيجة إعادة التوجيه GET وسيتم توجيهها إلى الأسلوب PeopleDisplay، والذي بدوره يستدعي ببساطة الأسلوب People باستخدام المعلمة الصحيحة.النشر من النموذج يستدعي أسلوب الأشخاص مباشرة.يتيح لك استخدام طريقتين استخدام آلية منع CSRF.قد تتمكن من استخدام علامة في TempData لضمان استدعاء إجراء GET فقط عبر آلية إعادة التوجيه إذا كنت مهتمًا بتقييد الوصول إليه.

إنهاء التعديل

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

نصائح أخرى

يمكنك استخدام الأسلوب RedirectToAction إصدار 301 إعادة توجيه لطريقة عمل معين على أية وحدة تحكم، جنبا إلى جنب مع القيم المسار:

ReportMeta meta = _reportDataAccess.Get(id);
return RedirectToAction(meta.Action, meta.Controller, meta.RouteData);

وحيث تلك القيم هي شيء مثل:

meta.Action = "Bar";
meta.Controller = "Foo";
meta.RouteData = new {
    // possibly settings for the grid
    start = DateTime.Min,
    end = DateTime.Now,
    sort = "Date"
    // you get the idea
};

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

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