【问题标题】:Ajax call to a controller action result returns error message对控制器操作结果的 Ajax 调用返回错误消息
【发布时间】:2014-03-11 09:20:56
【问题描述】:

我正在对名为 Estatement 的 ActionResult 方法进行 Ajax 调用。 这就是我想要发生的事情

  1. 如果 checkUser = false,则应该重定向到视图

  2. 如果 checkuser 不为 false,我想成功返回 Done 并使用我的 ajax 代码做点什么。

现在我无法重定向到语句视图,我得到的只是来自错误消息的警报(尝试处理此错误时发生错误)

你认为这段代码有什么问题?

    <div class="eStmnt">
        <div class="eStmntAd">
            <h3>Go Green!</h3>       
        </div>

        <p class="eStmntAffirm hide">Testing Testing</p>
    </div>


    <script type="text/javascript">
        $(".eStmnt").click(function() {

            $.ajax({
                type: "POST",
                url: '@Url.Action("Estatement","MyController")',
                dataType: "json",
                success:function(result) {               
                    if (result == "Done") {
                        $(".eStmntAffirm").removeClass("hide").addClass("show");
                    }                   
                },
                error: function() {
                    alert('An error occured while trying to process this');
                }
            });

        });

    </script>


     public ActionResult  Estatement()
            {

                bool checkUser = false;
                string result = string.Empty;

                if (checkUser == false)
                {
                    return RedirectToAction("Statement","MyProducts");       
                }

                result = "Done";

                return Json(result);

            }

【问题讨论】:

    标签: jquery asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    您的控制器需要返回 JsonResult 而不是 ActionResult

    例如:http://geekswithblogs.net/michelotti/archive/2008/06/28/mvc-json---jsonresult-and-jquery.aspx

    【讨论】:

    • ActionResultJsonResult 的基类,所以没问题。见MSDN DOCs
    • 你是对的,虽然我更喜欢显式返回类型。
    【解决方案2】:

    由于 Ajax 需要 JSON,因此您的方法将不起作用。不过你可以试试这个

    Ajax 成功回调函数

    success:function(data) {               
        //Do something when result is done
        if (data.status == "error" && data.redirectionUrl != "") {
            window.location.replace(data.redirectionUrl)
        }
        //Do something when result is done
        if (data.status == "success" && data.result == "Done") {
            $(".eStmntAffirm").removeClass("hide").addClass("show");
        }                   
    },
    

    控制器

    public ActionResult  Estatement()
    {       
        bool checkUser = false;
        string result = string.Empty;
    
        if (checkUser == false)
        {
            UrlHelper urlHelper = new UrlHelper(this.ControllerContext.RequestContext);
            return Json(new {
                status = "success"
                redirectionUrl = urlHelper.Action("Statement","MyProducts")
            });
        }
    
        return Json(new {
            status = "success"
            result = "Done"
        });   
    }
    

    【讨论】:

    • 控制器中有一个可用的UrlHelper,只需设置Url.Action(...)
    【解决方案3】:

    您采用了错误的方法...要处理此需求,您需要遵循此流程...

    首先将您的 ajax 调用类型更改为 "Get" 或者如果它是 post 然后更改您的操作方法,如下所示:

    1.将Ajax类型改为Post。

                 [HttpPost]
                 public ActionResult  Estatement()
                   {
    
                    bool checkUser = false;
                    string result = string.Empty;
                     result = "Done";
                    if (checkUser == false)
                    {
                        result ="False";  
                    }
    
    
                    return Json(result,JsonAllowBehaviour.AllowGet);
    
                }
    

    然后在你的 ajax 调用的成功方法中写下:

        <script type="text/javascript">
        $(".eStmnt").click(function() {
    
            $.ajax({
                type: "POST",
                url: '@Url.Action("Estatement","MyController")',
                dataType: "json",
                success:function(result) {               
                    if (result == "Done") {
                        $(".eStmntAffirm").removeClass("hide").addClass("show");
                    }   
             // Condtion for redirect...
                      else
                     {
                     window.location='@Url.Action("Statement","MyProducts")';
                     }                 
                },
                error: function() {
                    alert('An error occured while trying to process this');
                }
            });
    
        });
    

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      相关资源
      最近更新 更多