如何设置动作结果的结果以使用Post而不是Get。 我需要将结果重定向到需要使用post方法发送数据的外部站点。
(想知道如何使用httpverbs.post过滤器重定向到另一个动作 - 但此时对我来说并不重要。)
答案 0 :(得分:3)
根据定义,重定向将生成GET请求。您可以使用WebClient代表他们执行POST,但您无法使用POST将浏览器重定向到那里。如果帖子需要转到其他网站,您可能只想生成表单操作,以便直接在那里发布。
答案 1 :(得分:0)
您可以执行以下操作:返回一个动作结果,该结果会发出包含字段的表单,并使用一些JavaScript自动发布已发布的表单。
以下是HttpPostResult的代码
public class HttpPostResult :
ActionResult
{
string _formName;
NameValueCollection _inputs;
string _url;
public HttpPostResult(
string url ,
NameValueCollection inputs ,
string formName = "form1" )
{
_url = url;
_inputs = inputs;
_formName = formName;
}
public override void ExecuteResult( ControllerContext context )
{
// Html generation
var html = new StringBuilder();
html.Append( "<html><body onload=\"document.form1.submit()\">" );
html.AppendFormat(
"<form name=\"{0}\" method=\"POST\" action=\"{1}\">" ,
_formName ,
_url
);
foreach( var key in _inputs.AllKeys )
html.AppendFormat(
"<input name=\"{0}\" type=\"hidden\" value=\"{1}\">" ,
key ,
_inputs[ key ]
);
html.Append( "</form></body></html>" );
// Write to Response stream
context.HttpContext.Response.Write( html.ToString() );
context.HttpContext.Response.End();
}
}
然后,当您需要控制器中的操作结果返回POST而不是GET时使用:
return new HttpPostResult( url , inputs );