কীভাবে একটি এএসপি.নেট এমভিসি অ্যাজাক্স প্রতিক্রিয়া আপডেটডেটরেটআইডে ভিউ ofোকানোর পরিবর্তে নতুন পৃষ্ঠায় পুনর্নির্দেশের জন্য পাবেন?


88

আমি একটি ফর্ম তৈরি করতে আজাক্স.বাগিনফর্ম ব্যবহার করছি যা একটি নির্দিষ্ট নিয়ামক ক্রিয়ায় একটি এজাক্স পোস্টব্যাক করবে এবং তারপরে ক্রিয়াটি সফল হলে ব্যবহারকারীকে অন্য পৃষ্ঠায় পুনর্নির্দেশ করা উচিত (যদি ক্রিয়া ব্যর্থ হয় তবে স্থিতি বার্তা ব্যবহার করে প্রদর্শিত হবে) অ্যাজাক্সঅপশন আপডেটট্রেটআইডি)।

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
আমি একমত, এটি সঠিক পদ্ধতির। এই উত্তর stackoverflow.com/a/2841608/498969 দেখায় যে আপনি কীভাবে বেস নিয়ামক ব্যবহার করে ডিফল্টরূপে এই কার্যকারিতাটি প্রয়োগ করতে পারেন।
অ্যাডাম স্পাইসার

@ বেন ফস্টার: এই ব্রাউজটি ব্যবহার করে ইউআরএল খোলার চেষ্টা করুন :: :: উইন্ডো.লোকেশন ..। আমি এটিকে পৃথক প্রশ্ন হিসাবে পোস্ট করেছি স্ট্যাকওভারফ্লো
এন্ড্রুস

30
আপনি যদি আপনার প্রকল্পের কোনও নিয়ামককে পুনর্নির্দেশ করতে চান তবে আপনি নিজের জন্য ইউআরএল সহায়কটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ:return JavaScript( "window.location = '" + Url.Action("Edit","Dispatch") + "'" );
ক্রিস মরগান

এটি আমাকে কাঁদতে চায়। ধারণাগুলি এবং বেস নিয়ামক ধারণার সমন্বয় দুর্দান্ত।
সিক্রেটইপ

30

আপনি ইউআরএল দিয়ে একটি জেএসএন ফিরিয়ে দিতে পারেন এবং ক্লায়েন্টের পাশে জাভাস্ক্রিপ্ট ব্যবহার করে উইন্ডো l লোকেশন পরিবর্তন করতে পারেন। আমি সার্ভার থেকে জাভাস্ক্রিপ্ট ফাংশন কল করার চেয়ে এই উপায়ে পছন্দ করি, যা আমি মনে করি এটি উদ্বেগের বিচ্ছেদকে ভেঙে দিচ্ছে।

সার্ভারের দিক:

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

মক্কেলের পক্ষে:

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

অবশ্যই আপনি আরও যুক্তি যুক্ত করতে পারেন কারণ সার্ভারের দিকে কোনও ত্রুটি থাকতে পারে এবং সেই ক্ষেত্রে ফলাফলের সম্পত্তিটি এই পরিস্থিতিটি নির্দেশ করে এবং পুনঃনির্দেশটি এড়াতে পারে।


13

মার্জিত না হলেও কিছু পরিস্থিতিতে আমার পক্ষে কাজ করে।

নিয়ামক

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; }

/ ভিউজ / শেয়ার্ড / জাভাস্ক্রিপ্ট রেডাইরেক্ট.কোশটিএমএল

@model Models.Shared.JavascriptRedirectModel

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

4
মার্জিত না কেন? এটি দৃ strongly়ভাবে টাইপ করা হয়েছে, এবং এটি পরিষ্কার অনুভব করে। আমি যে পদ্ধতির পছন্দ। +1
টি-মোটি 6'15

12

আপনি যে আচরণটি উত্পাদনের চেষ্টা করছেন সেটি অ্যাজেএক্স ব্যবহার করে খুব ভাল করা হয় না। আপনি যদি কেবলমাত্র পৃষ্ঠার কোনও অংশ আপডেট করতে চান, অন্য কোনও পৃষ্ঠায় পুরোপুরি পুনর্নির্দেশ না করে তবে এজ্যাক্স সেরা ব্যবহৃত হবে। এটি সত্যই অ্যাজাক্সের পুরো উদ্দেশ্যকে পরাস্ত করে।

আমি আপনাকে যে আচরণটি বর্ণনা করছি তার সাথে কেবল এজ্যাক্স না ব্যবহার করার পরামর্শ দেব।

বিকল্পভাবে, আপনি jquery Ajax ব্যবহার করার চেষ্টা করতে পারেন, যা অনুরোধটি জমা দেয় এবং তারপরে অনুরোধটি সম্পূর্ণ হওয়ার পরে আপনি একটি কলব্যাক নির্দিষ্ট করেন। কলব্যাকে আপনি নির্ধারণ করতে পারেন যে এটি ব্যর্থ হয়েছে বা সফল হয়েছে কিনা এবং সাফল্যের অন্য পৃষ্ঠায় পুনর্নির্দেশ করতে হবে। আমি jquery Ajax ব্যবহার করা আরও সহজ হিসাবে খুঁজে পেয়েছি, বিশেষত যেহেতু আমি ইতিমধ্যে যেভাবেই অন্য জিনিসগুলির জন্য গ্রন্থাগারটি ব্যবহার করছি।

আপনি jquery আজাক্স সম্পর্কে ডকুমেন্টেশন এখানে পেতে পারেন , তবে বাক্য গঠনটি নিম্নরূপ:

jQuery.ajax( options )  

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

jQuery.getJSON( url, data, callback )

jQuery.getScript( url, callback )

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

সুতরাং কেবল মুছুন ক্রিয়াতে একটি নিয়মিত পোস্ট করুন এবং বেশিরভাগ ক্ষেত্রে এটি সফল হবে এবং তারপরে আমি হোম সূচক পৃষ্ঠাতে পুনর্নির্দেশ করতে পারি। যে ক্ষেত্রে এটি ব্যর্থ হবে, তারপরে ত্রুটি বার্তাগুলি এবং ব্যবহারকারীর জন্য যথাযথ ব্যবস্থা গ্রহণের সাথে একটি ভিন্ন দৃষ্টিভঙ্গি প্রদর্শন করুন। ভাল লাগছে?
জেফ ওয়াইডার

হ্যাঁ মনে হচ্ছে এটি আরও বোধগম্য হবে।
জোসেফ

জোসেফের পরামর্শ অনুযায়ী নিয়মিত পোষ্টে জমা দিয়ে আজাক্স থেকে এটিকে রূপান্তর করে আমি এগিয়ে গেলাম। এটি আসলে আরও ভাল কাজ করেছে যেহেতু এটি আমাকে মুছার নিশ্চয়তার বার্তাটি হ্যান্ডেল করার একটি ক্লিনার উপায় দিয়েছে।
জেফ ওয়াইডার

6

ব্যবহার JavaScriptনিশ্চিতভাবে কাজ করবে।

Contentএটি আপনার স্টাইলটি বেশি হলে আপনিও ব্যবহার করতে পারেন।

উদাহরণ:

এমভিসি নিয়ন্ত্রক

[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

আপনি কেবল সঙ্গে প্রতিক্রিয়া incomming জন্য Ajax প্রতিক্রিয়া ফিল্টার কিছু করতে পারি না $ .ajaxSetup । যদি প্রতিক্রিয়াতে এমভিসি পুনঃনির্দেশ থাকে আপনি জেএস পক্ষে এই অভিব্যক্তিটি মূল্যায়ন করতে পারেন। নীচে জেএসের জন্য উদাহরণ কোড:

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

যদি ডেটা হয়: "উইন্ডো.লোকেশন = '/ একাউন্ট / লগইন'" উপরের ফিল্টারটি এটি ধরে ফেলবে এবং পুনঃনির্দেশটি তৈরি করতে মূল্যায়ন করবে।


0

আমি জোসেফের সেরা উত্তরে সন্তুষ্ট নই, সঠিক সমস্যা সমাধানের পরিবর্তে, তিনি বলেছিলেন যে এটি ভুল ব্যবহারের ক্ষেত্রে। প্রকৃতপক্ষে অনেকগুলি স্থান রয়েছে উদাহরণস্বরূপ, আপনি যদি কোনও পুরানো কোডবাসকে অজ্যাক্সাইড কোডে রূপান্তর করেন এবং সেখানে আপনাকে এটির প্রয়োজন হয়, তবে আপনি এটির প্রয়োজন। প্রোগ্রামিংয়ে কোনও অজুহাত নেই কারণ এটি কেবল আপনিই নন যিনি এর সমস্ত খারাপ এবং ভাল বিকাশকারীকে কোডিং করছেন এবং পাশাপাশি আপনাকে কাজ করতে হবে। সুতরাং আমি যদি এজাক্সে পুনঃনির্দেশের কোডটি না করি তবে আমার সহকর্মী বিকাশকারী আমাকে এর সমাধান পেতে বাধ্য করতে পারে। ঠিক যেমন আমি সমস্ত এএমডি প্যাটার্নযুক্ত সাইট বা এমভিসি 4 ব্যবহার করতে চাই এবং আমার সংস্থা আমাকে এক বছরের জন্য এ থেকে দূরে রাখতে পারে।

সুতরাং এখন সমাধান উপর কথা বলা যাক।

আমি এজাক্স অনুরোধ এবং প্রতিক্রিয়া পরিচালনা করার নরক কাজ করেছি এবং আমি যে সহজ উপায়টি পেয়েছি তা হল ক্লায়েন্টের কাছে স্থিতি কোডগুলি প্রেরণ করা এবং সেই কোডগুলি বোঝার জন্য একটি মানক জাভাস্ক্রিপ্ট ফাংশন রয়েছে। আমি যদি 13 নম্বর কোডের জন্য কেবল প্রেরণ করি তবে এর অর্থ একটি পুনঃনির্দেশ।

সুতরাং j স্ট্যাটাস কোড: ১৩, ম্যাসেজ: '/ হোম / লগ-ইন' এর মতো একটি জসন প্রতিক্রিয়া অবশ্যই tons স্ট্যাটাস: 'সাফল্য', কোড: 13, ইউআরএল: '/ হোম / লগ-ইন-এর মতো প্রস্তাবিত অনেকগুলি বৈচিত্র্য রয়েছে proposed ', বার্তা:' আপনি এখন লগ ইন করেছেন '}

ইত্যাদি, তাই আপনার নিজের পছন্দসই স্ট্যান্ডার্ড বার্তাগুলি

সাধারণত আমি বেস কন্ট্রোলার ক্লাস থেকে উত্তরাধিকারী এবং আমার পছন্দ মত মান পছন্দ

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 এর aj .জ্যাক্স আন্তঃ ব্যবহার সম্পর্কে আমি জ্যাকুরি এজাক্স ব্যবহার করতে পছন্দ করব এবং আমি তা করি তবে সিদ্ধান্ত নিতে আমি পুরো পৃথিবীতে আবার তা করি না আমার কাছে অ্যাজ্যাক্স.বেগিনফর্ম পূর্ণ রয়েছে এবং অবশ্যই আমি তা করি নি। তবে আমাকে এর সাথেই বাঁচতে হবে।

সুতরাং প্রারম্ভিক ফর্মটিতেও একটি সাফল্য কলব্যাক রয়েছে, কলব্যাকগুলি ব্যবহার করার জন্য আপনার জ্যাকোরি এজ্যাক্স ব্যবহার করার দরকার নেই এখানে অ্যাজাক্স Bবিগেনফর্ম, কলস অ্যাকশন, রিটার্নস জেএসওএন, আমি কীভাবে আমার অনস্যাক্সেস জেএস ফাংশনে জেএসএন অবজেক্টটি অ্যাক্সেস করব?

ধন্যবাদ


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));
        }
    }

তারপরে আপনার ক্রিয়াকলাপে কল করুন:

this.RedirectTo ("সূচক", "সিমেন্ট");

সমস্ত অ্যাজাক্স অনুরোধগুলি আটকাতে কোনও বৈশ্বিক জাভাস্ক্রিপ্ট অন্তর্ভুক্ত ফাইল বা বিন্যাস ফাইলটিতে জাভাস্ক্রিপ্ট কোড যুক্ত করুন:

<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") + "'\" />");

দ্রষ্টব্য: আমি আবিষ্কার করেছি যে মেটা রিফ্রেশগুলি ফায়ারফক্স দ্বারা স্বয়ংক্রিয়ভাবে অক্ষম করা হয়েছে, এটি খুব দরকারী নয় re

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.