Asp.Net MVC后期行动结果

时间:2010-01-20 18:31:28

标签: asp.net-mvc post actionresult

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

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

2 个答案:

答案 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 );