ASP.NET MVC Ajax ত্রুটি পরিচালনা করার


117

যখন জ্যাকোরি এজ্যাক্স কোনও ক্রিয়াকলাপটি কল করে আমি কোনও নিয়ামকের মধ্যে ফেলে দেওয়া ব্যতিক্রমগুলি কীভাবে পরিচালনা করব?

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

ক্লায়েন্ট পক্ষের, আমি আজাক্স ত্রুটিতে একটি ফাংশন কল করব।

সার্ভারে, আমার কি কাস্টম অ্যাকশনফিল্টার লেখার দরকার আছে?


8
একটি ভাল উদাহরণের জন্য বেক্কেলম্যান্স পোস্ট দেখুন । ডারিনস এই পোস্টের উত্তরটি ভাল তবে একটি ত্রুটির জন্য সঠিক স্থিতি কোডটি সেট করবেন না।
ড্যান

6
দুঃখজনকভাবে সেই লিঙ্কটি এখন ভেঙে গেছে
ক্রিস নেভিল

1
: এখানে wayback মেশিনে লিঙ্ক web.archive.org/web/20111011105139/http://beckelman.net/post/...
BruceHill

উত্তর:


161

যদি সার্ভার 200 এর চেয়ে আলাদা কিছু স্থিতি কোড প্রেরণ করে তবে ত্রুটি কলব্যাক কার্যকর করা হয়:

$.ajax({
    url: '/foo',
    success: function(result) {
        alert('yeap');
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert('oops, something bad happened');
    }
});

এবং একটি বিশ্বব্যাপী ত্রুটি হ্যান্ডলার নিবন্ধিত করতে আপনি এই $.ajaxSetup()পদ্ধতিটি ব্যবহার করতে পারেন :

$.ajaxSetup({
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert('oops, something bad happened');
    }
});

আর একটি উপায় জেএসএন ব্যবহার করা। সুতরাং আপনি সার্ভারে একটি কাস্টম অ্যাকশন ফিল্টার লিখতে পারেন যা ব্যতিক্রম এবং এটিকে JSON প্রতিক্রিয়াতে রূপান্তরিত করে:

public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;
        filterContext.Result = new JsonResult
        {
            Data = new { success = false, error = filterContext.Exception.ToString() },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
}

এবং তারপরে এই বৈশিষ্ট্যটি সহ আপনার নিয়ামক ক্রিয়াকে সজ্জিত করুন:

[MyErrorHandler]
public ActionResult Foo(string id)
{
    if (string.IsNullOrEmpty(id))
    {
        throw new Exception("oh no");
    }
    return Json(new { success = true });
}

এবং অবশেষে এটি প্রার্থনা করুন:

$.getJSON('/home/foo', { id: null }, function (result) {
    if (!result.success) {
        alert(result.error);
    } else {
        // handle the success
    }
});

1
এর জন্য ধন্যবাদ, দ্বিতীয়টি আমি যা খুঁজছিলাম। সুতরাং এসপ নেটওয়্যার এমভিসি ব্যতিক্রমের জন্য, এটি ছুঁড়ে ফেলার দরকার কি একটি নির্দিষ্ট উপায় আছে যাতে এটি jquery ত্রুটি হ্যান্ডলারের দ্বারা ধরা যায়?
শান ম্লেয়ান

1
@ লল কোডার, আপনি নিয়ন্ত্রণকারী ক্রিয়াকলাপের মধ্যে কীভাবে কোনও ব্যতিক্রম ছুঁড়ে মারেন তা বিবেচনা না করে সার্ভার 500 স্ট্যাটাস কোডটি ফিরিয়ে দেবে এবং errorকলব্যাক কার্যকর করা হবে।
দারিন দিমিত্রভ

ধন্যবাদ, নিখুঁত, ঠিক আমি যা খুঁজছিলাম।
শান ম্লেয়ান

1
500 এর স্ট্যাটাস কোডটি কি এক ধরণের ভুল হবে না? এই লোকটা উদ্ধৃত করা broadcast.oreilly.com/2011/06/... : "বুঝতে পারি যে একটি 4xx ত্রুটি অর্থ আমি বিশৃঙ্খলার সৃষ্টি এবং কোন 5xx মানে কি বিশৃঙ্খলার সৃষ্টি ব্যর্থ" - যেখানে আমি ক্লায়েন্ট এবং আপনি সার্ভার।
ক্রিস নেভিল 10

এই উত্তরটি এখনও এএসপনেটের নতুন সংস্করণগুলির জন্য বৈধ?
গোগ

73

গুগল করার পরে আমি এমভিসি অ্যাকশন ফিল্টারের উপর ভিত্তি করে একটি সাধারণ ব্যতিক্রম হ্যান্ডিং লিখি:

public class HandleExceptionAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
        {
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            filterContext.Result = new JsonResult
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new
                {
                    filterContext.Exception.Message,
                    filterContext.Exception.StackTrace
                }
            };
            filterContext.ExceptionHandled = true;
        }
        else
        {
            base.OnException(filterContext);
        }
    }
}

এবং গ্লোবাল.অ্যাসেক্সে লিখুন:

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
      filters.Add(new HandleExceptionAttribute());
 }

এবং তারপরে এই স্ক্রিপ্টটি লেআউট বা মাস্টার পৃষ্ঠায় লিখুন:

<script type="text/javascript">
      $(document).ajaxError(function (e, jqxhr, settings, exception) {
                       e.stopPropagation();
                       if (jqxhr != null)
                           alert(jqxhr.responseText);
                     });
</script>

অবশেষে আপনার কাস্টম ত্রুটি চালু করা উচিত। এবং তারপরে এটি উপভোগ করুন :)


ফায়ারব্যাগে ত্রুটিটি দেখতে পাচ্ছি তবে এটি ত্রুটি পৃষ্ঠায় পুনর্নির্দেশ করছে না?
ব্যবহারকারী2067567

1
এর জন্য ধন্যবাদ! উত্তর আইএমও হিসাবে এটি এজাক্স অনুরোধগুলিতে ফিল্টারিং হিসাবে চিহ্নিত করা উচিত এবং হ্যান্ডলআরআরট্রিবিউট উত্তরাধিকার সূত্রে প্রাপ্ত উত্তরাধিকারের চেয়ে সঠিক শ্রেণীর উত্তরাধিকারী হবে
এমটিবেনেট

2
দুর্দান্ত উত্তর! : ডি
লেনিয়েল ম্যাককাফেরি

1
আমি মনে করি "অনুরোধ.আইএসএজএক্সআরেক্সেস্ট ()" কখনও কখনও এটি নির্ভরযোগ্য হয় না।
হুয়াং

ডিবাগ কনফিগারেশনের জন্য এটি সর্বদা কাজ করে তবে রিলিজ কনফিগারেশনে সর্বদা কাজ করে না এবং এইচটিএমএল পরিবর্তে কারও কারও পক্ষে এ জাতীয় ক্ষেত্রে কাজ করতে পারে?
হিতেন্দ্র

9

দুর্ভাগ্যক্রমে, উত্তরগুলির দুটিই আমার পক্ষে ভাল নয়। আশ্চর্যজনকভাবে সমাধানটি অনেক সহজ। নিয়ামক থেকে ফিরে:

return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Response.ReasonPhrase);

এবং এটি আপনার পছন্দ মতো ক্লায়েন্টে স্ট্যান্ডার্ড এইচটিটিপি ত্রুটি হিসাবে পরিচালনা করুন।


@ উইল হুয়াং: ব্যতিক্রমের নামটির নাম
স্কেমেন্ড্রিক

আমি প্রথম যুক্তি দিতে হবে int। এছাড়াও, যখন আমি এটি করি, ফলাফলটি ajax successহ্যান্ডলারের কাছে নয়, errorহ্যান্ডলারের কাছে দেওয়া হয়। এটা কি প্রত্যাশিত আচরণ?
জোনাথন উড

4

আমি একটি দ্রুত সমাধান করেছি কারণ আমার সময় অল্প ছিল এবং এটি ঠিক কাজ করেছিল worked যদিও আমি মনে করি আরও ভাল বিকল্পটি একটি ব্যাতিক্রম ফিল্টার ব্যবহার করা হয়, তবে সম্ভবত আমার সমাধান সেই ক্ষেত্রে সহায়তা করতে পারে যে একটি সহজ সমাধান প্রয়োজন।

আমি নিম্নলিখিতটি করেছিলাম। কন্ট্রোলার পদ্ধতিতে আমি একটি জসনআরসাল্টকে ডেটার অভ্যন্তরে "সাফল্য" দিয়ে ফিরে পেয়েছি:

    [HttpPut]
    public JsonResult UpdateEmployeeConfig(EmployeConfig employeToSave) 
    {
        if (!ModelState.IsValid)
        {
            return new JsonResult
            {
                Data = new { ErrorMessage = "Model is not valid", Success = false },
                ContentEncoding = System.Text.Encoding.UTF8,
                JsonRequestBehavior = JsonRequestBehavior.DenyGet
            };
        }
        try
        {
            MyDbContext db = new MyDbContext();

            db.Entry(employeToSave).State = EntityState.Modified;
            db.SaveChanges();

            DTO.EmployeConfig user = (DTO.EmployeConfig)Session["EmployeLoggin"];

            if (employeToSave.Id == user.Id)
            {
                user.Company = employeToSave.Company;
                user.Language = employeToSave.Language;
                user.Money = employeToSave.Money;
                user.CostCenter = employeToSave.CostCenter;

                Session["EmployeLoggin"] = user;
            }
        }
        catch (Exception ex) 
        {
            return new JsonResult
            {
                Data = new { ErrorMessage = ex.Message, Success = false },
                ContentEncoding = System.Text.Encoding.UTF8,
                JsonRequestBehavior = JsonRequestBehavior.DenyGet
            };
        }

        return new JsonResult() { Data = new { Success = true }, };
    }

পরে এজ্যাক্স কলটিতে আমি কেবল এই সম্পত্তিটি জানতে চাইলে আমার কোনও ব্যতিক্রম আছে কিনা:

$.ajax({
    url: 'UpdateEmployeeConfig',
    type: 'PUT',
    data: JSON.stringify(EmployeConfig),
    contentType: "application/json;charset=utf-8",
    success: function (data) {
        if (data.Success) {
            //This is for the example. Please do something prettier for the user, :)
            alert('All was really ok');                                           
        }
        else {
            alert('Oups.. we had errors: ' + data.ErrorMessage);
        }
    },
    error: function (request, status, error) {
       alert('oh, errors here. The call to the server is not working.')
    }
});

আশাকরি এটা সাহায্য করবে. শুভ কোড! : P: P


4

Aleho এর প্রতিক্রিয়া সঙ্গে একমত এখানে একটি সম্পূর্ণ উদাহরণ। এটি একটি কবজির মতো কাজ করে এবং অতি সাধারণ।

নিয়ামক কোড

[HttpGet]
public async Task<ActionResult> ChildItems()
{
    var client = TranslationDataHttpClient.GetClient();
    HttpResponseMessage response = await client.GetAsync("childItems);

    if (response.IsSuccessStatusCode)
        {
            string content = response.Content.ReadAsStringAsync().Result;
            List<WorkflowItem> parameters = JsonConvert.DeserializeObject<List<WorkflowItem>>(content);
            return Json(content, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return new HttpStatusCodeResult(response.StatusCode, response.ReasonPhrase);
        }
    }
}

জাভাস্ক্রিপ্ট কোড দেখুন

var url = '@Html.Raw(@Url.Action("ChildItems", "WorkflowItemModal")';

$.ajax({
    type: "GET",
    dataType: "json",
    url: url,
    contentType: "application/json; charset=utf-8",
    success: function (data) {
        // Do something with the returned data
    },
    error: function (xhr, status, error) {
        // Handle the error.
    }
});

আশাকরি এটি কাউকে সাহায্য করবে!


0

ক্লায়েন্টের পক্ষ থেকে আজাক্স কলগুলি থেকে ত্রুটিগুলি পরিচালনা করার জন্য, আপনি errorআজাক্স কলটির বিকল্পটিতে একটি ফাংশন বরাদ্দ করেন।

বিশ্বব্যাপী একটি ডিফল্ট সেট করতে, আপনি এখানে বর্ণিত ফাংশনটি ব্যবহার করতে পারেন: http://api.jquery.com/jQuery.ajaxSetup


4 বছর আগে আমি যে উত্তর দিয়েছিলাম তা হঠাৎ করে ডাউন ভোট পায়? কারও কারও কারও কারও কারও কারও কারণ নেই?
ব্রায়ান বল

1
এসওএফ-এর সাথে যোগাযোগ করুন এবং তাদের ডিবিএকে নীচে ভোট কারা দিয়েছেন তা জিজ্ঞাসা করুন। এরপরে, সেই ব্যক্তিকে বার্তা দিন যাতে তারা ব্যাখ্যা করতে পারে। শুধু কারণই কোনও কারণ দিতে পারে না।
JoshYates1980
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.