1

如何将操作结果的结果设置为使用 Post 而不是 Get。我需要将结果重定向到需要使用 post 方法发送数据的外部站点。

(还想知道如何使用 httpverbs.post 过滤器重定向到另一个动作 - 但此时对我来说并不重要)。

4

2 回答 2

3

根据定义,重定向将生成 GET 请求。您可以使用 WebClient 代表他们执行 POST,但您不能使用 POST 将他们的浏览器重定向到那里。如果帖子需要转到另一个站点,您可能希望简单地生成表单操作,以便它直接在那里发布。

于 2010-01-20T18:35:55.820 回答
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 );
于 2014-09-12T06:37:21.003 回答