Javascript 试图在不重新加载页面(MVC)的情况下将错误消息从控制器传递到视图

Javascript 试图在不重新加载页面(MVC)的情况下将错误消息从控制器传递到视图,javascript,jquery,asp.net,asp.net-mvc,error-handling,Javascript,Jquery,Asp.net,Asp.net Mvc,Error Handling,我试图让我的视图在控制器的ActionResult失败时显示错误消息。(当您按下视图中的按钮时,会触发此选项。) 但是,无论我尝试什么,ActionResult总是重定向到不同的页面。如果我尝试返回View(),它将转到默认的黄色ASP.Net错误页面。如果我试图返回内容(“错误消息”),它只会打开一个包含该文本的空白页面 我已经在ViewBag.error中保存了固定的错误消息,但是我视图中的javascript从来没有机会使用它,因为只要单击我的按钮,ActionResult就会将我重定向到

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

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

我已经在ViewBag.error中保存了固定的错误消息,但是我视图中的javascript从来没有机会使用它,因为只要单击我的按钮,ActionResult就会将我重定向到某个地方

如果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>
。。。名为#dd route的下拉菜单。。。
$(函数(){
$('#dd route')。更改(函数(){
var$route=$(this.val();
var$url='@url.Action(“electrodechecklist”,“wip”)?id='+$route;
$('#btn print').attr('href',$url);
});
$(“#btn打印”)。单击(函数(){
var$error=ViewBag.error;
如果($error!=“”){
$('#alertbar').show();
$('#alert').html($error);
}
})
});
当用户在下拉菜单中选择一个项目时,调用my ActionResult的url将输入按钮的href属性。然后,当他们单击按钮时,它会使用下拉列表中的正确值将其触发


JavaScript的第二部分是我试图在控制器中遇到if语句时显示错误消息。

我之所以写这个,是因为它不适合注释

好的,首先要注意的是,它将开始使用
id
导航到Action
ElectrodeChecklist
,然后执行
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所建议的那样。这里的操作是用户最初所在的页面。您可以将它们重定向到任何错误页面,仍然可以访问
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);
        }
    })

我写这篇文章只是因为它不适合评论

好的,首先要注意的是,它将开始使用
id
导航到Action
ElectrodeChecklist
,然后执行
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所建议的那样。这里的操作是用户最初所在的页面。您可以将它们重定向到任何错误页面,仍然可以访问
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);
        }
    })

检查以下代码,无需刷新即可在第页显示错误消息:

$('dd route')。更改(函数(){
var TestModel={
“id”:$(“路由”).val()
}
$.ajax({
url:“/wip/electrodechecklist”,
类型:“Post”,
async:false,
数据:JSON.stringify(TestModel),
数据类型:“html”,
contentType:“应用程序/json;字符集=utf-8”,
成功:功能(结果){
var$error=ViewBag.error;
如果($error!=“”){
$('#alertbar').show();
$('#alert').html($error);
}
}
});

});检查以下代码,无需刷新即可在第页显示错误消息:

$('dd route')。更改(函数(){
var TestModel={
“id”:$(“路由”).val()
}
$.ajax({
url:“/wip/electrodechecklist”,
类型:“Post”,
async:false,
数据:JSON.stringify(TestModel),
数据类型:“html”,
contentType:“应用程序/json;字符集=utf-8”,
成功:功能(结果){
var$error=ViewBag.error;
如果($error!=“”){
$('#alertbar').show();
$('#alert').html($error);
}
}
});

});这是GET方法吗?如果是,请将错误消息添加到
TempData
,并重定向到生成原始视图的方法。在该方法中,检查消息是否存在,并将其添加到
ViewBag
,因为我们没有查看部分,如果它是
的按钮,则在
表单中
这将提交可能导致您描述的内容的整个页面。如果它是GET,那么您到底是如何加载此页面的?默认的黄色ASP.Net错误页面是说找不到ElectrodeChecklist
?如果您正在执行ajax.get()
,请共享该代码。我编辑了我的问题以显示视图。我没有使用Ajax,因为Ajax不能很好地下载东西。@StephenMuecke感谢TempData的建议!使用了搜索的答案,效果很好。这是一种获取方法吗?如果是,请将错误消息添加到
TempData
,并重定向到生成原始视图的方法。在该方法中,检查消息是否存在,并将其添加到
ViewBag
,因为我们没有查看部分,如果它是
的按钮,则在
表单中
这将提交可能导致您描述的内容的整个页面。如果它是GET,那么您到底是如何加载此页面的?