【问题标题】:Return JavaScript call from the controller of ASP.NET MVC 4 Razor从 ASP.NET MVC 4 Razor 的控制器返回 JavaScript 调用
【发布时间】:2013-06-22 10:45:37
【问题描述】:

我想处理我的 ASP.NET MVC 4 项目中的一些错误。早些时候我正在开发 WebForms 应用程序,我使用过 Page.ClientScript.RegisterClientScriptBlock,但是 MVC != WebForms 及其服务器控件、回发等......所以我有点困惑。

当然,我可以使用 return Json(...) 之类的东西从控制器返回 JSON 响应,但请稍等。

我有一个观点。它有一个精确的标记。我的视图如何识别我必须从我的 jQuery + 引导代码中调用哪个模态框?

首先,我想到了使用 GET 参数来处理查询字符串。

如果 /Index/UserNotExist -> 调用 jQuery 函数并显示自定义模态框

Else if other some URL -> 比调用 jQuery 函数显示相同的模态框,但其中包含其他文本。

我尝试使用一些代码来处理当前位置,但失败了(奇怪的是,脚本块的结尾部分 jQuery 的脚本运行良好,但确切地说该脚本甚至没有触发)。

然后我想到了cookie,将临时数据写入cookie并做一个简单的检查。

但是在 WebForms 中这样的代码检查 if (Request.Cookies["error"] != null 运行良好,MVC 甚至不接受这样的检查,它总是会产生异常。

我有点累了,想听听你的建议。

我做错了什么?

谢谢

【问题讨论】:

  • 您是否正在寻找一种在客户端中公开服务器端错误的方法?抱歉,我在这里没有按照您的需要进行操作。
  • @RacielR。是的,你是对的,我需要在客户端进行错误筛选,使用 javascript 从控制器的端点获取结果。但我想,我已经正确地描述了我的问题以便理解:(

标签: jquery asp.net-mvc-4 razor error-handling callback


【解决方案1】:

我将错误从服务器带到客户端的方式是使用 TempData。

我通常有一个基本控制器,我将它和其他所有控制器通用的管道放置在其中。

所以,这个方法

    protected void AddError(string message, string header = null)
    {
        TempData[Constants.ErrorKey] = new ViewMessage
        {
            Type = eMessageType.Error,
            Header = header,
            Content = message
        };
    }

将错误消息添加到 TempData。

在我的 _Layout.cshtml 中,我有一个显示错误的部分,使用引导程序的警报:

@if (TempData[Constants.ErrorKey] != null)
{            
    var error = TempData[Constants.ErrorKey] as ViewMessage;
    <div class="alert alert-block alert-error fade in">
        <a class="close" data-dismiss="alert" href="#">&times;</a>
        <br />
        <h4 class="alert-heading">@error.Header:</h4>
        <p>@error.Content</p>
        <br />
    </div>
    <br />
}

因此,只要在任何控制器中调用操作都会产生业务逻辑错误,就会有带有错误内容的警报。

您实际上可以为未处理的异常组合操作过滤器,并根据需要尽可能复杂,但这是基本思想。

当然你也可以使用 Session 但 TempData 更合适,因为值在你使用后被释放。

另一方面,如果您使用 ajax 与您的操作进行交互,那么它就是纯粹的客户端脚本和 dom 操作。

【讨论】:

    【解决方案2】:

    如果我理解正确的话......

    public class UserController : Controller
    {
        public ActionResult GetUser(int userId)
        {
            var user = // Get user by user id.
            if (user == null)
               return null;
            else
            {
               var serializer = new JavaScriptSerializer();
               return Json (new {user = serializer.Serialize(user)});
            }
        }
    }
    
    public class ModalViewController : Controller
    {
        public ActionResult Index(string message)
        {
           ViewBag.Message = message;
           return PartialView("ModalView");
        }
    }
    
    var actionUrl = '/User/GetUser';
    var data = { "userId": userId };
    
    $.ajax({
        url: actionUrl,
        type: "POST",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(data),
        success: function (user) {
               ShowModalView(user == null || user.length <= 0);
           },
        error: function (jqXHR, textStatus, errorThrown) {
           alert(eval("(" + jqXHR.responseText + ")"));
        });
    
    function ShowModalView(userExists) {
    var actionUrl = '/ModalView/Index';
    var data = { "message": userExists ? "hi there user" : "oops, no user found" };
    
    $.ajax({
        url: actionUrl,
        type: "POST",
        dataType: "html",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(data),
        success: function (modalView) {
            $('#detailsDiv').replaceWith(modalView);
           },
        error: function (jqXHR, textStatus, errorThrown) {
           alert(eval("(" + jqXHR.responseText + ")"));
        });
    }
    

    所以本质上,您首先对操作方法进行 ajax 调用以检查用户是否存在,然后再进行 ajax 调用以返回模态视图的部分视图。模态视图从 ViewBag 中获取消息,并在您的第二个 ajax 调用的成功回调方法中,您可以在主视图中的任意位置渲染局部视图。

    【讨论】:

    • 不,你不明白我需要什么,不过感谢您的关注
    • 现在怎么样? ShowModalView() 将对 ModalViewController 进行另一个 ajax 调用,以显示带有正确消息的视图。
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多