尝试将没有页面重新加载(MVC)的错误消息从Controller传递到View

时间:2016-11-17 00:00:43

标签: javascript jquery asp.net asp.net-mvc error-handling

我正在尝试让我的View在我的控制器的ActionResult失败时显示错误消息。 (当您按下视图中的按钮时会触发它。)

然而,无论我尝试什么,ActionResult总是重定向到不同的页面。如果我尝试返回View(),它将转到默认的黄色ASP.Net错误页面。如果我尝试返回内容(“错误消息”),它只会打开一个包含该文本的空白页面。

我已经在ViewBag.Error中保存了我的预设错误消息,但我的View中的javascript永远不会有机会使用它,因为只要您单击我的按钮,ActionResult会将我重定向到某个地方。

如何让我的View保持不变,但如果ActionResult失败,仍会传递消息?

这是我在控制器中调用的方法:

public ActionResult ElectrodeChecklist(int id)
{
    var routeChecklist = _routeService.GetRouteChecklist(id);

    // This is where I'm trying to catch this error.
    if (routeChecklist.Count == 0)
    {
        ViewBag.Error = "This route has no checklist steps to print.";
        return ???
    }

    ...
    blah blah stuff to download a PDF file when everything works
    ...


    return new BinaryContentResult(buffer, "application/pdf", filename);
}

编辑:这是视图:

... dropdown menu called #dd-route...

<a href="#" id="btn-print" class="btn btn-success btn-sm">Generate PDF</a>

<script type="text/javascript">

    $(function () {

        $('#dd-route').change(function () {
            var $route = $(this).val();
            var $url = '@Url.Action("electrodechecklist", "wip")?id=' + $route;
            $('#btn-print').attr('href', $url);
        });

        $('#btn-print').click(function () {
            var $error = ViewBag.Error;
            if ($error != "") {
                $('#alertbar').show();
                $('#alert').html($error);
            }
        })

    });


</script>

当用户在下拉菜单中选择一个项目时,调用我的ActionResult的URL将被输入到按钮的href属性中。然后,当他们点击按钮时,会使用下拉列表中的正确值将其触发。

JavaScript的第二部分是我尝试在控制器中点击If语句时显示错误消息。

2 个答案:

答案 0 :(得分:2)

我之所以写这篇文章是因为它不适合评论。

好的首先要注意的是,它将开始使用ElectrodeChecklist导航到动作id,然后执行BinaryContentResult所做的事情。我看不出var $error = ViewBag.Error;可能如何工作,但我又不知道BinaryContentResult是如何做什么的。

如果您希望用户看到ViewBag.Error,则需要修改此部分

if (routeChecklist.Count == 0)
{
    TempData["Error"]  = "This route has no checklist steps to print.";
    return  RedirectToAction("ACTION", "CONTROLLER");
}

由@StephenMuecke建议。这里的ACTION是用户首先使用的页面。您可以将它们重定向到任何错误页面,然后仍然可以访问TempData["Error"]。如果这仍然没有做你想要的,请告诉我们。

 //What you are trying to do here is awesome 
 //but I'm not sure if it's even possible as you are moving away from the page when the user clicks the button/link
 //I'd like other please comment on this. I could use it too
$('#btn-print').click(function () {
        var $error = ViewBag.Error;
        if ($error != "") {
            $('#alertbar').show();
            $('#alert').html($error);
        }
    })

答案 1 :(得分:0)

检查以下代码,如果没有刷新,您可以在页面上显示错误消息:

&#13;
&#13;
 $('#dd-route').change(function () {
  var TestModel = {
  "id": $("route").val()
  }
$.ajax({
                    url: '/wip/electrodechecklist',
                    type: "Post",
                    async: false,
                    data: JSON.stringify(TestModel),
                    dataType: "html",
                    contentType: "application/json;charset=utf-8",
                    success: function (result) {
                        var $error = ViewBag.Error;
            if ($error != "") {
                $('#alertbar').show();
                $('#alert').html($error);
            }
        }
});
});
&#13;
&#13;
&#13;

希望这会对你有所帮助!!