当不需要页面刷新时,MVC中的正确返回类型是什么

时间:2014-05-17 15:11:53

标签: asp.net-mvc

我的网页使用Jquery来重载屏幕。在此叠加层中,用户可以键入一些细节,然后单击“提交”按钮。

我想要做的是,当用户点击提交时,叠加层不会消失(就像刷新页面一样),但会显示一条消息,例如“全部完成”

我的问题是,正确的返回类型是什么?我确定,我已陷入困境。

我尝试制作返回类型字符串,并返回字符串。可悲的是,这会将我重定向到一个带有字符串值的页面。

然后我想我需要使用ContentResult()返回return Content(myString)。结果与返回字符串相同。

然后我尝试返回void,只是在我的控制器中使用ViewBag.Status ="All done";现在这需要一个空页。

如何在不丢失状态的情况下让消息显示“全部完成”或“完成”?如果没有Ajax或类似的话,我是否会尝试不可能的事情?

2 个答案:

答案 0 :(得分:2)

是的,你正试图做不可能的事。当控制器操作被同步请求(例如表单提交)命中时,您总是将获得整页加载。这正是同步请求 的原因。实际上,在您的操作代码运行之前已经发生了“刷新”;动作的返回类型是无关紧要的。对于部分更新,您需要一个异步请求,这意味着AJAX。

这种方法的典型方法是加载叠加层,然后通过AJAX从叠加层提交表单,返回局部视图并使用jQuery定位容器。您通常会为叠加层创建某种通用包装器,以便为任何叠加层中的所有表单帖子执行此操作。

或者,您可以查看返回JSON并使用Handlebars之类的JavaScript模板引擎来填充视图。

无论哪种方式,最好将所有这些包装在一些“通用”JavaScript代码中,这些代码将对所有叠加层中的表单帖子执行相同的操作;那么你就可以不再担心客户端代码,而只关注从控制器操作中返回正确的东西。

答案 1 :(得分:1)

如果你想在没有ajax的情况下这样做,你需要再次返回整个底层页面,包括弹出窗口处于可见状态。

你(可能)应该做的是使用ajax并返回json结果。像这个jQuery解决方案:

$(document).on('click', '[type="submit"]', function(){
    var $form = $(this).closest('form');
    $.ajax({
        url: $form.action,
        type: 'post',
        data: $form.serialize(),
        success: function(response){
            // write success message to user
        }
    });
});