UpdateTargetId में दृश्य डालने के बजाय नए पृष्ठ पर रीडायरेक्ट करने के लिए ASP.NET MVC Ajax प्रतिक्रिया कैसे प्राप्त करें?


88

मैं Ajax.BeginForm का उपयोग कर रहा हूं, एक फार्म बनाने के लिए एक निश्चित नियंत्रक कार्रवाई के लिए एक अजाक्स पोस्टबैक करेगा और फिर यदि कार्रवाई सफल होती है, तो उपयोगकर्ता को दूसरे पृष्ठ पर पुनर्निर्देशित किया जाना चाहिए (यदि कार्रवाई विफल हो जाती है तो एक स्थिति का उपयोग करके प्रदर्शित होता है) AjaxOptions UpdateTargetId)।

using (Ajax.BeginForm("Delete", null,
        new { userId = Model.UserId },
        new AjaxOptions { UpdateTargetId = "UserForm", LoadingElementId = "DeletingDiv" },
        new { name = "DeleteForm", id = "DeleteForm" }))
   {
    [HTML DELETE BUTTON]
   }

यदि डिलीट सफल रहा तो मैं एक रिडायरेक्ट रिजल्ट लौटा रहा हूं:

[Authorize]
public ActionResult Delete(Int32 UserId)
{
    UserRepository.DeleteUser(UserId);
    return Redirect(Url.Action("Index", "Home"));
}

लेकिन होम कंट्रोलर इंडेक्स व्यू अपडेटटार्गेटआईड में लोड हो रहा है और इसलिए मैं एक पेज के भीतर पेज के साथ समाप्त होता हूं। दो बातें जो मैं सोच रहा हूँ:

  1. या तो मैं इस गलत तरीके से काम कर रहा हूं और इस प्रकार की कार्रवाई को अलग तरह से संभालना चाहिए (अजाक्स का उपयोग नहीं करना चाहिए)।
  2. रिडायरेक्ट रिजल्ट को वापस करने के बजाय, एक ऐसा दृश्य लौटाएं जिसमें जावास्क्रिप्ट है जो क्लाइंट की तरफ रीडायरेक्ट करता है।

क्या किसी ने # 1 पर टिप्पणी की है? या अगर # 2 एक अच्छा समाधान है, तो "रीडायरेक्ट जावास्क्रिप्ट दृश्य" कैसा दिखेगा?

जवाबों:


171

आप इसे JavascriptResultप्राप्त करने के लिए उपयोग कर सकते हैं ।

पुनर्निर्देशित करने के लिए:

return JavaScript("window.location = 'http://www.google.co.uk'");

वर्तमान पृष्ठ को पुनः लोड करने के लिए:

return JavaScript("location.reload(true)");

सबसे सरल विकल्प लगता है।


4
बहुत बढ़िया .. मेरी मदद की।
क्रेजीकोडर्ज़

1
मैं सहमत हूं, यह सही तरीका है। यह उत्तर stackoverflow.com/a/2841608/498969 दिखाता है कि आप आधार नियंत्रक का उपयोग करके डिफ़ॉल्ट रूप से इस कार्यक्षमता को कैसे लागू कर सकते हैं।
एडम स्पाइसर

@ बीन फोस्टर: इस ब्राउज़ का उपयोग करके url http: window.location को खोलने का प्रयास किया जाता है। मैंने इसे अलग प्रश्न के रूप में पोस्ट किया है stackoverflow.com/questions/13896307/…
Andrus

30
यदि आप अपने प्रोजेक्ट में किसी कंट्रोलर को रीडायरेक्ट करना चाहते हैं तो आप अपने लिए यूआरएल हेल्पर का उपयोग कर सकते हैं। उदाहरण के लिए:return JavaScript( "window.location = '" + Url.Action("Edit","Dispatch") + "'" );
क्रिस मॉर्गन

2
कम। सरल। अति उत्कृष्ट। महान!
विक्रम

30

आप URL के साथ एक JSON लौटा सकते हैं और क्लाइंट पक्ष पर जावास्क्रिप्ट का उपयोग करके window.location को बदल सकते हैं। मैं सर्वर से जावास्क्रिप्ट फ़ंक्शन को कॉल करने की तुलना में इस तरह से पसंद करता हूं, जो मुझे लगता है कि यह चिंताओं के अलगाव को तोड़ रहा है।

सर्वर साइड:

return Json(new {result = "Redirect", url = Url.Action("ActionName", "ControllerName")});

ग्राहक की ओर:

if (response.result == 'Redirect')
    window.location = response.url;

बेशक आप अधिक तर्क जोड़ सकते हैं क्योंकि सर्वर की ओर से कोई त्रुटि हो सकती है और उस स्थिति में परिणाम संपत्ति इस स्थिति को इंगित कर सकती है और पुनर्निर्देशन से बच सकती है।


12

व्यवहार जो आप बनाने की कोशिश कर रहे हैं वह वास्तव में AJAX का उपयोग करके सबसे अच्छा नहीं है। यदि आप केवल पृष्ठ के एक हिस्से को अपडेट करना चाहते हैं, तो AJAX का सबसे अच्छा उपयोग किया जाएगा, न कि किसी अन्य पृष्ठ पर पूरी तरह से अनुप्रेषित। यह वास्तव में AJAX के पूरे उद्देश्य को हरा देता है।

मैं सुझाव दूंगा कि आप जिस व्यवहार का वर्णन कर रहे हैं उसके साथ AJAX का उपयोग न करें।

वैकल्पिक रूप से, आप jquery अजाक्स का उपयोग करने का प्रयास कर सकते हैं, जो अनुरोध सबमिट करेगा और फिर अनुरोध पूरा होने पर आपको कॉलबैक निर्दिष्ट करेगा। कॉलबैक में आप यह निर्धारित कर सकते हैं कि यह विफल हो गया या सफल हुआ, और सफलता पर दूसरे पृष्ठ पर पुनर्निर्देशित किया गया। मैं jquery अजाक्स का उपयोग करने के लिए बहुत आसान हो गया है, खासकर जब से मैं पहले से ही अन्य चीजों के लिए पुस्तकालय का उपयोग कर रहा हूँ।

आप यहाँ jquery ajax के बारे में प्रलेखन पा सकते हैं , लेकिन वाक्य रचना इस प्रकार है:

jQuery.ajax( options )  

jQuery.get( url, data, callback, type)

jQuery.getJSON( url, data, callback )

jQuery.getScript( url, callback )

jQuery.post( url, data, callback, type)

तो फिर बस एक नियमित पोस्ट को हटाएं कार्रवाई करें और ज्यादातर मामलों में यह सफल होगा और फिर मैं होम इंडेक्स पेज पर रीडायरेक्ट कर सकता हूं। उन मामलों में जहां यह विफल हो जाएगा, फिर त्रुटि संदेशों और उपयोगकर्ता के लिए उपयुक्त कार्रवाई के साथ एक अलग दृश्य प्रदर्शित करें। ठीक लगता है?
जेफ विडमर

हाँ, ऐसा लगता है कि यह अधिक समझ में आता है।
यूसुफ

मैं जोसेफ की सिफारिश के अनुसार एक अजाक्स जमा से इसे नियमित POST में परिवर्तित करने के साथ आगे बढ़ा। वास्तव में इसने बेहतर काम किया क्योंकि इसने मुझे डिलीट कन्फर्मेशन मैसेजिंग को संभालने के लिए एक क्लीनर तरीका दिया।
जेफ विडमर

12

सुरुचिपूर्ण नहीं है, लेकिन कुछ स्थितियों में मेरे लिए काम करता है।

नियंत्रक

if (RedirectToPage)
    return PartialView("JavascriptRedirect", new JavascriptRedirectModel("http://www.google.com"));
else
   ... return regular ajax partialview

नमूना

    public JavascriptRedirectModel(string location)
    {
        Location = location;
    }

    public string Location { get; set; }

/Views/Shared/JavascriptRedirect.cshtml

@model Models.Shared.JavascriptRedirectModel

<script type="text/javascript">
    window.location = '@Model.Location';
</script>

2
सुरुचिपूर्ण क्यों नहीं? यह दृढ़ता से टाइप किया गया है, और यह स्पष्ट लगता है। मुझे वह तरीका पसंद है। +1
टी-मोटी

6

का उपयोग JavaScriptनिश्चित रूप से काम करेंगे।

आप यह भी उपयोग कर सकते हैं Contentयदि यह आपकी शैली है।

उदाहरण:

MVC नियंत्रक

[HttpPost]
public ActionResult AjaxMethod()
{
    return Content(@"http://www.google.co.uk");
}

जावास्क्रिप्ट

$.ajax({
    type: 'POST',
    url: '/AjaxMethod',
    success: function (redirect) {
        window.location = redirect;
    }
});

धन्यवाद! इसने वास्तव में मेरी मदद की।
डीई

5

आप बस नीचे की तरह अजाक्स सफलता में लिख सकते हैं:

 $.ajax({
            type: "POST",
            url: '@Url.Action("GetUserList", "User")',
            data: { id: $("#UID").val() },
            success: function (data) {
                window.location.href = '@Url.Action("Dashboard", "User")';
            },
            error: function () {
                $("#loader").fadeOut("slow");
            }
});

2

इस बारे में कैसा है :

public ActionResult GetGrid()
{
   string url = "login.html";
   return new HttpStatusCodeResult(System.Net.HttpStatusCode.Redirect,url)
}

और तब

$(document).ajaxError(function (event, jqxhr, settings, thrownError) { 
   if (jqxhr.status == 302) {
      location.href = jqxhr.statusText;
   }           
});

या

error: function (a, b, c) {
       if (a.status == 302) {
         location.href = a.statusText;
       }  
}

1

मुझे ऐसा करने की आवश्यकता थी क्योंकि मेरे पास एक अजाक्स लॉगिन फ़ॉर्म है। जब उपयोगकर्ता सफलतापूर्वक लॉगिन करते हैं तो मैं एक नए पृष्ठ पर पुनर्निर्देशित करता हूं और पिछले अनुरोध को समाप्त करता हूं क्योंकि दूसरा पृष्ठ फिर से निर्भर पार्टी को पुनर्निर्देशित करता है (क्योंकि यह एसटीएस एसएसओ सिस्टम है)।

हालाँकि, मैं यह भी चाहता था कि यह जावास्क्रिप्ट अक्षम के साथ काम करे, केंद्रीय लॉगिन हॉप और सभी होने के नाते, इसलिए मैं इसके साथ आया,

    public static string EnsureUrlEndsWithSlash(string url)
    {
        if (string.IsNullOrEmpty(url))
            throw new ArgumentNullException("url");
        if (!url.EndsWith("/"))
            return string.Concat(url, "/");
        return url;
    }

    public static string GetQueryStringFromArray(KeyValuePair<string, string>[] values)
    {
        Dictionary<string, string> dValues = new Dictionary<string,string>();
        foreach(var pair in values)            
            dValues.Add(pair.Key, pair.Value);            
        var array = (from key in dValues.Keys select string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(dValues[key]))).ToArray();
        return "?" + string.Join("&", array);
    }

    public static void RedirectTo(this HttpRequestBase request, string url, params KeyValuePair<string, string>[] queryParameters)
    {            
        string redirectUrl = string.Concat(EnsureUrlEndsWithSlash(url), GetQueryStringFromArray(queryParameters));
        if (request.IsAjaxRequest())
            HttpContext.Current.Response.Write(string.Format("<script type=\"text/javascript\">window.location='{0}';</script>", redirectUrl));
        else
            HttpContext.Current.Response.Redirect(redirectUrl, true);

    }

1

आप बस $ .ajaxSetup के साथ incomming प्रतिक्रियाओं के लिए किसी प्रकार का अजाक्स प्रतिक्रिया फ़िल्टर कर सकते हैं । यदि प्रतिक्रिया में MVC पुनर्निर्देशन शामिल है तो आप JS की ओर इस अभिव्यक्ति का मूल्यांकन कर सकते हैं। नीचे जेएस के लिए उदाहरण कोड:

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data && typeof data == "string") {
            if (data.indexOf('window.location') > -1) {
                eval(data);
            }
        }
        return data;
    }
});

यदि डेटा है: "window.location = '/ Acount / Login'" उपरोक्त फ़िल्टर उस को पकड़ लेगा और पुनर्निर्देशन करने के लिए मूल्यांकन करेगा।


0

मैं यूसुफ के सबसे अच्छे उत्तर से संतुष्ट नहीं हूं, सही समस्या को ठीक करने के बजाय, उन्होंने बताया कि यह गलत उपयोग का मामला है। वास्तव में उदाहरण के लिए कई स्थान हैं यदि आप एक पुराने कोडबेस को ajaxified कोड में परिवर्तित कर रहे हैं और वहां आपको इसकी आवश्यकता है, तो आपने इसे हटा दिया। प्रोग्रामिंग में, कोई बहाना नहीं है क्योंकि यह न केवल आप है जो अपने सभी बुरे और अच्छे डेवलपर्स को कोड कर रहा है और आपको एक साथ काम करना होगा। तो अगर मैं अजाक्स में कोड पुनर्निर्देशन नहीं करता हूं तो मेरे साथी डेवलपर मुझे इसके लिए एक समाधान करने के लिए मजबूर कर सकते हैं। जैसे मैं सभी AMD प्रतिरूपित साइटों या mvc4 का उपयोग करना पसंद करता हूं, और मेरी कंपनी मुझे एक वर्ष के लिए इससे दूर रख सकती है।

तो चलिए अब समाधान पर बात करते हैं।

मैंने ajax रिक्वेस्ट और रिस्पांस हैंडलिंग का नरक किया है और मुझे जो सबसे आसान तरीका पता चला है वह था क्लाइंट को स्टेटस कोड भेजना और उन कोड्स को समझने के लिए एक मानक जावास्क्रिप्ट फंक्शन होना। अगर मैं केवल उदाहरण कोड 13 के लिए भेजूं तो इसका मतलब पुनर्निर्देशित हो सकता है।

तो एक json प्रतिक्रिया जैसे {statusCode: 13, messsage: '/ home / लॉग-इन'} निश्चित रूप से प्रस्तावित कई विविधताएं हैं जैसे {स्थिति: 'सफलता', कोड: 13, url: '/ home / लॉग-इन ', संदेश:' अब आप लॉग इन हैं '}

आदि, मानक संदेशों की अपनी पसंद पर निर्भर है

आमतौर पर मैं बेस कंट्रोलर क्लास से इनहेरिट करता हूं और इस तरह की मानक प्रतिक्रियाओं की अपनी पसंद रखता हूं

public JsonResult JsonDataResult(object data, string optionalMessage = "")
    {
        return Json(new { data = data, status = "success", message = optionalMessage }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonSuccessResult(string message)
    {
        return Json(new { data = "", status = "success", message = message }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonErrorResult(string message)
    {
        return Json(new { data = "", status = "error", message = message }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonRawResult(object data)
    {
        return Json(data, JsonRequestBehavior.AllowGet);
    }

Ajax.BeginForm के $ .ajax intead का उपयोग करने के बारे में। मैं jquery ajax का उपयोग करना पसंद करूंगा और मैं करता हूं, लेकिन फिर से मुझे निर्णय लेने के लिए पूरी दुनिया में नहीं है मेरे पास Ajax.BeginForm से भरा एक आवेदन है और निश्चित रूप से मैंने ऐसा नहीं किया है। लेकिन मुझे इसके साथ रहना होगा।

तो प्रारंभ फॉर्म में भी एक सफलता कॉलबैक है, आपको कॉलबैक का उपयोग करने के लिए jquery ajax का उपयोग करने की आवश्यकता नहीं है। Ajax.BeginForm, कॉल एक्शन, रिटर्न JSON, मैं अपने OnSuccess JS फ़ंक्शन में JSON ऑब्जेक्ट का उपयोग कैसे करूँ?

धन्यवाद


0

यदि आप जावास्क्रिप्ट वर्ग से पुनर्निर्देशित हैं

एक ही दृश्य - विभिन्न नियंत्रक

<strike>window.location.href = `'Home'`;</strike>

एक ही दृश्य नहीं है

<strike>window.location.href = `'Index/Home'`;</strike>

0

एक सहायक वर्ग जोड़ें:

public static class Redirector {
        public static void RedirectTo(this Controller ct, string action) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action));
        }

        public static void RedirectTo(this Controller ct, string action, string controller) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action, controller));
        }

        public static void RedirectTo(this Controller ct, string action, string controller, object routeValues) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action, controller, routeValues));
        }
    }

फिर अपनी कार्रवाई में कॉल करें:

यह। रीडायरेक्टो ("इंडेक्स", "सीमेंट");

सभी अजाक्स अनुरोधों को रोकने के लिए जावास्क्रिप्ट कोड को किसी भी वैश्विक जावास्क्रिप्ट शामिल फ़ाइल या लेआउट फ़ाइल में जोड़ें:

<script type="text/javascript">
  $(function() {
    $(document).ajaxComplete(function (event, xhr, settings) {
            var urlHeader = xhr.getResponseHeader('AjaxRedirectURL');

            if (urlHeader != null && urlHeader !== undefined) {
                window.location = xhr.getResponseHeader('AjaxRedirectURL');
            }
        });
  });
</script>


0

जैसा कि बेन फोस्टर कहते हैं कि आप जावास्क्रिप्ट को वापस कर सकते हैं और यह आपको वांछित पृष्ठ पर पुनर्निर्देशित करेगा।

वर्तमान पृष्ठ में पेज लोड करने के लिए:

return JavaScript("window.location = 'http://www.google.co.uk'");'

पृष्ठ को नए टैब में लोड करने के लिए:

return JavaScript("window.open('http://www.google.co.uk')");

0

आप मेटा मेटा रिफ्रेश टैग में से किसी एक में डालकर नॉन-जेएस-आधारित पुनर्निर्देशन प्राप्त कर सकते हैं। यह यहाँ काम करने लगता है: return Content("<meta http-equiv=\"refresh\" content=\"0;URL='" + @Url.Action("Index", "Home") + "'\" />");

नोट: मुझे पता चला कि मेटा रीफ़्रेश फ़ायरफ़ॉक्स द्वारा ऑटो-डिसेबल हैं, यह बहुत उपयोगी नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.