1

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

当然,我可以使用 smth like 从控制器返回 JSON 响应return Json(...),但请稍等。

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

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

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

否则,如果其他一些 URL -> 则调用 jQuery 函数并显示相同的模态框,但其中包含其他文本。

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

然后我想到了cookie,将临时数据写入cookie并进行简单检查。

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

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

我究竟做错了什么?

谢谢

4

2 回答 2

2

我将错误从服务器带到客户端的方式 - 当不使用 ajax 来使用我的控制器的操作时 - 是使用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 />
}

So anytime calling an action in any controller produces a business logic error, there is an alert with the error content.

You can actually combine action filters for unhandled exceptions and be as sophisticated as you need, but this is the basic idea.

Off course you can also use the Session but TempData is more suitable because the values are disposed after you use them.

If, on the other hand, you are using ajax to interact with your actions, then it is pure client side scripting and dom manipulation.

于 2013-06-25T16:41:45.540 回答
0

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

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

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

于 2013-06-25T15:03:24.450 回答