如何強迫指定RedirectToAction 為POST

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何強迫指定RedirectToAction 為POST相关的知识,希望对你有一定的参考价值。

参考技术A 问题在於你在 View 里所使用的 $.post(),你要先了解 jQuery 的 $.post() 是做什麼样的用途,

jQuery.post()
$.post() 同於 $.Ajax( type: 'POST', .......... );
是把资料从前端 POST 到後端,然後再将後端所处理後所传回的资料再传给 callback 所指定的方法,

而你所想要达成点击 button 之後再转到其他 controller 的 action,你的处理方式就不对了,

1.
首先,你要先养成一个习惯,不要在 html Tag 中直接指定事件,也就是要用 unobtrusive (非侵入式 or 谦卑式) 的写法,可以改写成如下:

<input type ="button" id ="x" value="click" />

<script type="text/javascript">

$(document).ready(function ()
$('#x').click(ChanageAction);
);

function ChanageAction()
$.post('@Url.Action("ChangeAction", "Home")');

</script>

2.

再来就是如果你只是要做一个单纯的按下 button 後就转移到另一个 controller 的 action 所呈现的 View,

其实不必使用 $.post(),也不用在自己本身的 controller 去另外建立一个用来转页的 action 方法,

可以用下的方式:

<script type="text/javascript">

$(document).ready(function ()
$('#x').click(ChanageAction);
);

function ChanageAction()
location.href = '@Url.Action("Index", "B")';

</script>

3.

如果真的要从前端 POST 送资料到後端,记得在 Controller 的 Action 方法上方标注 [HttpPost] 的 Attribute
4.

另外,有时候除了对 Controller 的程式做中断侦错之外,因为有在 View 中使用 Javascript 程式,

所以也需要另外针对前端的 Javascript 程式做中断处理,

很多时候後端程式没有错误的情况下,大多会是前端的 javascript 程式有可能发生问题,

而前端 javascript 的侦错,在目前的主流浏览器都有提供 Developer Tools,可以用来侦错前端 javascript 程式,

可以参考以下各浏览器的 Developer Tools 的介绍:

各主要浏览器的开发者工具( Developer Tool ) Part.1 - Firefox

各主要浏览器的开发者工具( Developer Tool ) Part.2 - IE

各主要浏览器的开发者工具( Developer Tool ) Part.4 - WebKit

因为 Opera 已经宣布将采用 Webkit,所以就不提供 Opera 的 Developer Tool 介绍(其实上面的系列文章中 Part.3 就是介绍 Opera 的 Dragonfly)

另外补充,我用 Firefox 的 firebug 来观察前端,这边是用你原本一开始的写法,前端 button 按下去後有 post 到後端,

而後端也有把 RedirectToAction 後的资料传送回前端,但因为前端 $.post() 并没有指定 callback 来处理回传的资料,所以页面是没有任何变化,本回答被提问者和网友采纳

RedirectToAction() 丢失请求数据

【中文标题】RedirectToAction() 丢失请求数据【英文标题】:RedirectToAction() loss request data 【发布时间】:2014-03-03 08:20:48 【问题描述】:

您在提交表单后遇到验证错误的一种情况,您希望重定向回表单,但希望 URL 反映表单的 URL,而不是页面操作。

如果我使用 viewData 参数,我的 POST 参数将更改为 GET 参数。

如何避免? 我希望该选项未更改为 GET 参数。

【问题讨论】:

【参考方案1】:

正确的设计模式是在验证错误的情况下不重定向,而是再次呈现相同的表单。仅当操作成功时才​​应重定向。

例子:

[HttpPost]
public ActionResult Index(MyViewModel model)

    if (!ModelState.IsValid)
    
        // some validation error occurred => redisplay the same form so that the user
        // can fix his errors
        return View(model);
    

    // at this stage we know that the model is valid => let's attempt to process it
    string errorMessage;
    if (!DoSomethingWithTheModel(out errorMessage))
    
        // some business transaction failed => redisplay the same view informing
        // the user that something went wrong with the processing of his request
        ModelState.AddModelError("", errorMessage);
        return View(model);
    

    // Success => redirect
    return RedirectToAction("Success");

此模式允许您保留所有模型值,以防发生某些错误并且您需要重新显示相同的视图。

【讨论】:

谢谢!刚发现这个题目有类似问题***.com/questions/1936/…

以上是关于如何強迫指定RedirectToAction 為POST的主要内容,如果未能解决你的问题,请参考以下文章

使用 RedirectToAction 时如何跳过控制器名称?

如何使用 RedirectToAction 方法添加查询字符串值?

如何在 Asp.NET MVC 中使用 RedirectToAction() 传递多个对象?

如何在 ASP.NET MVC 中 RedirectToAction 而不会丢失请求数据

如何在 ASP.NET MVC 6 中继续使用 ModelState 和 RedirectToAction?

RedirectToAction() 丢失请求数据