تحكم الربيع MVC إعادة توجيه إلى "السابقة" الصفحة؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

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

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

المحلول

وخيار واحد، بالطبع، سيكون لفتح النموذج تحرير في نافذة جديدة، لذلك كل المستخدم القيام به هو وثيق بها وانهم الى حيث كانوا.

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

وخيارات أخرى: 1) يمكنك تخزين "التحويلية" رأس واستخدام ذلك، ولكن هذا قد لا يكون الاعتماد عليها. ليس كل المتصفحات مجموعة أن الرأس. 2) هل يمكن أن يكون جافا سكريبت على صفحة التأكيد بعد تقديم النموذج الذي يدعو "history.go(-2)".

نصائح أخرى

إليك كيفية القيام بذلك الفتيان (لاحظ أن هذا هو الربيع مريحة 3 تركيب MVC ولكنها ستعمل في وحدات تحكم الربيع القديمة):

@RequestMapping(value = "/rate", method = RequestMethod.POST)
public String rateHandler(HttpServletRequest request) {
    //your controller code
    String referer = request.getHeader("Referer");
    return "redirect:"+ referer;
}

وجوابي هو على حد سواء لسام Brodkins's (ط أوصت أيضا). ولكن وجود في العدد الذي قد لا يكون "التحويلية" قيمة متاح أدليت به هذه الوظيفة لاستخدامها في وحدات تحكم بلدي

/**
* Returns the viewName to return for coming back to the sender url
*
* @param request Instance of {@link HttpServletRequest} or use an injected instance
* @return Optional with the view name. Recomended to use an alternativa url with
* {@link Optional#orElse(java.lang.Object)}
*/
protected Optional<String> getPreviousPageByRequest(HttpServletRequest request)
{
   return Optional.ofNullable(request.getHeader("Referer")).map(requestUrl -> "redirect:" + requestUrl);
}

وهكذا في وظيفة تحكم المتصل بك يجب أن تعيد شيئا من هذا القبيل:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody
String testRedirection(HttpServletRequest request)
{
      //Logic....
      //Returns to the sender url
      return getPreviousPageByRequest(request).orElse("/"); //else go to home page
}

ونعم أعتقد فكرة يعقوب للنموذج في نافذة جديدة قد يكون خيارا جيدا. أو في شعبة مخفي. مثل الحوار دوجو. http://dojocampus.org/explorer/#Dijit_Dialog_Basic

والخيار الآخر سيكون لتصميم عناوين المواقع الخاصة بك حتى أنها تكشف عن سياق ما تفعلونه، والاتفاقية ستسمح لك "معرفة" أين كان بداية العملية.

وعلى سبيل المثال، يمكن أن يكون لديك عناوين مثل ذلك

site/section1/pony/edit
site/section1/pony/delete

site/somewhere/else/entirely/pony/edit
site/somewhere/else/entirely/pony/delete

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

ويمكنك أيضا تتبع ModelAndView (أو مجرد وجهة نظر) التي تم عرضها الأخير للمستخدم مع اعتراضية. هذا المثال بتتبع فقط نموذج آخر وعرض، ولكن هل يمكن استخدام قائمة للتنقل المزيد من المستويات.

package com.sample;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LastModelAndViewInterceptor extends HandlerInterceptorAdapter {

    public static final String LAST_MODEL_VIEW_ATTRIBUTE = LastModelAndViewInterceptor.class.getName() + ".lastModelAndView";

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        request.getSession(true).setAttribute(LAST_MODEL_VIEW_ATTRIBUTE, modelAndView);
        super.postHandle(request, response, handler, modelAndView);
    }

}

ومع التكوين الربيع XML:

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="com.sample.LastModelAndViewInterceptor"/>
    </property>
</bean>

وبعد ذلك استخدام التعليمات البرمجية التالية للحصول على العودة إلى هذا الرأي في وحدة تحكم:

ModelAndView mv = (ModelAndView)request.getSession().getAttribute(LastModelAndViewInterceptor.LAST_MODEL_VIEW_ATTRIBUTE);
return mv;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top