2010-01-20 101 views
1

如何将操作结果的结果设置为使用Post和Not Get。 我需要将结果重定向到需要使用post方法发送数据的外部站点。Asp.Net MVC后操作结果

(想知道如何使用httpverbs.post过滤器重定向到另一个动作 - 但在这一点上对我而言并不重要)。

回答

3

根据定义,重定向会生成一个GET请求。您可以使用WebClient代表他们进行POST,但您无法使用POST重定向他们的浏览器。如果帖子需要转到另一个站点,您可能只需简单地生成表单操作,以便直接发布。

+0

谢谢!我将创建一个隐藏所有字段的视图,并使用js单击提交按钮。 – Debra 2010-01-21 07:08:52

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