【问题标题】:what is the best way to show errors on asp.net mvc ajax requests在 asp.net mvc ajax 请求上显示错误的最佳方法是什么
【发布时间】:2010-10-29 11:25:55
【问题描述】:

如果我使用 jquery 向 asp.net mvc 控制器操作调用 ajax 请求,并且在该操作中引发异常,那么捕获该异常并向用户显示某些内容的最佳方法是什么。

现在我的加载图像永远持续下去。 . . .

这是我的控制器代码示例:

  public ActionResult BatchAdd(int[] sharepointKeys)
  {
           MyViewModel vm = GetViewModel();
            return PartialView("MyPartialView", vm);
  }

【问题讨论】:

    标签: jquery asp.net-mvc exception


    【解决方案1】:

    c#

    public JsonResult Action(...)
    {
        bool error = false;
        string msg = "";
        var data = "your data";
    
        try
        {
           //you code
        }
        catch (Exception ex)
        {
            error = true;
            msg = "Error ...";
        }
    
        return Json(new { error = error, msg = ms, data = data });
    }
    

    js:

    $.ajax({
       type: "POST",
       url: "Controller/Action",
       data: "...",
       beforeSend: function(xhr){
            $("#showError").empty();
       },
       error: function(xhr, ts, et){
            $("#showError").append("<div>Error</div>");
       },
       success: function(response){
    
         if (response.error) {
            $("#showError").append("<div>"+response.msg+"</div>");
         } 
         else {
            // code ok response
         }
    
    
       }
     });
    

    返回 ActionResult:

    索引.asp:

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        Home Page
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    
        <div id="showError"></div>
        <div id="dataHtml"></div>
    
        <button id="example">Example</button>
        <script type="text/javascript">
    
            $(function () {
    
                $("#example").bind('click', function (ex) {
    
                    $.ajax({
                        type: "POST",
                        url: "Home/BatchAdd",
                        data: { sharepointKeys: [1, 2, 3] },
                        beforeSend: function (xhr) {
                            $("#showError").empty();
                        },
                        error: function (xhr, ts, et) {
                            $("#showError").append("<div>Error</div>");
                        },
                        success: function (response) {
    
                            if ($(response).find("#error-message").length > 0) {
                                $("#showError").append("<div>" + $(response).find("#error-message").html() + "</div>");
                            }
                            else {
                                $("#dataHtml").html("<div>" + $(response).find("#container-response-ok").html() + "</div>");
                            }
    
    
                        }
                    });
                });
    
            });
    
        </script>
    
    </asp:Content>
    

    Site.master:

    <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
        <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
        <script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    </head>
    
    <body>
        <div class="page">
    
            <div id="header">
    
                <div id="menucontainer">
                    <ul id="menu">              
                        <li><%= Html.ActionLink("Home", "Index", "Home")%></li>
                        <li><%= Html.ActionLink("About", "About", "Home")%></li>
                    </ul>
                </div>
            </div>
    
            <div id="main">
                <asp:ContentPlaceHolder ID="MainContent" runat="server" />
                <div id="footer"></div>
            </div>
        </div>
    </body>
    </html>
    

    MyPartialView.ascx:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcApplication1.Controllers.MyViewModel>" %>
    <div>
        <% if (Model.Error)
        { %>
        <div id="error-message"><%= Model.Message %></div>
        <% } else { %>
        <div id="container-response-ok">
          <div> all ok </div>
        </div>
        <% } %>
    </div>
    

    HomeController.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace MvcApplication1.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                ViewData["Message"] = "Welcome to ASP.NET MVC!";
    
                return View();
            }
    
            public ActionResult BatchAdd(int[] sharepointKeys)
            {
                MyViewModel vm = GetViewModel();
    
                try
                {
                    vm.Error = true;
                    vm.Message = "Error testing";
                }
                catch (Exception ex)
                {
                    vm.Error = true;
                    vm.Message = "Errro";
                }
    
                return PartialView("MyPartialView", vm);
            }
    
            public ActionResult About()
            {
                return View();
            }
    
            private MyViewModel GetViewModel()
            {
                return (new MyViewModel());
            }
        }
    
    
    
        public class MyViewModel
        {
            public bool Error { get; set; }
            public string Message { get; set; }
    
            public MyViewModel()
            {
                this.Error = false;
                this.Message = "";
            }
        }
    
    }
    

    【讨论】:

    • 现在我正在返回一个 PartialResult(显然是 html),那么我该如何支持仍然支持异常响应
    • 你能举个例子说明你现在是如何使用ajax返回的
    • 我刚刚在我的模型中添加了一个错误属性。 . .
    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2012-03-30
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多