2012-03-27 56 views
0

我大致遵循了这个例子,但它并没有解决我的Sitecore相关的重定向问题。 sitecore web form for marketers form post to external urlWFFM表单POST和重定向

我已确认我的表单POST通过使用第三方POST测试工具正常工作。我遇到的问题是,在Sitecore中,如果提交是成功的,他们使用successMode来确定用户想要的待办事项。如果用户选择成功模式/消息,表单将重定向回到感谢消息。如果用户选择successmode/redirect,则成功方法管道会在表单中查找成功页面值,然后重定向发生到该URL。重定向的问题是它丢失了我的POST数据。

任何人都可以提供他们如何执行表单POST,然后重定向到目标外部URL而不丢失POST值的Sitecore示例?

您是否在表单中使用了successmode设置?

我在辩论是否覆盖成功模式重定向管道,添加条件和测试,但我打开可能包含jQuery的解决方案。

这里是我的代码:

 using Sitecore.Data; 
    using Sitecore.Form.Core.Client.Data.Submit; 
    using Sitecore.Form.Core.Controls.Data; 
    using Sitecore.Form.Submit; 
    using System.Web; 
    using Sitecore.Web.UI.HtmlControls; 
    using Sitecore.Text; 
    using Sitecore.Forms.Core.Data; 
    using Sitecore.Form.Core.Configuration; 
    using Sitecore.Forms.Core.Crm; 
    using System; 
    using System.IO; 
    using System.Net; 
    using Sitecore.Diagnostics; 
    using System.Text; 

    namespace XXXWffmExternals 
    { 
     public class Redirect : ISaveAction  
     {     
      UrlString url = new UrlString("https://XXX.XXX/default.asp"); 

      public virtual void Execute(ID formid, AdaptedResultList fields, params object[] data) 
      { 
       String strResult = "";    
       strResult = setPost(url.ToString(), fields); 

      } 

      public String setPost(string url, AdaptedResultList fieldListForPOST) 
      { 
       String resultReturn = ""; 

       AdaptedControlResult firstname = fieldListForPOST.GetEntry(this.First_Name, "First_Name"); 
       AdaptedControlResult lastname = fieldListForPOST.GetEntry(this.Last_Name, "Last_Name"); 
       AdaptedControlResult billingaddress = fieldListForPOST.GetEntry(this.Billing_Address, "Billing_Address"); 
       AdaptedControlResult billingcity = fieldListForPOST.GetEntry(this.Billing_City, "Billing_City"); 
       AdaptedControlResult billingstate = fieldListForPOST.GetEntry(this.Billing_State, "Billing_State"); 
       AdaptedControlResult billingzip = fieldListForPOST.GetEntry(this.Billing_Zip, "Billing_Zip"); 
       AdaptedControlResult billingphone = fieldListForPOST.GetEntry(this.Billing_Phone, "Billing_Phone"); 
       AdaptedControlResult email = fieldListForPOST.GetEntry(this.Email, "Email"); 
       AdaptedControlResult amount = fieldListForPOST.GetEntry(this.Amount, "Amount"); 
       AdaptedControlResult desc = fieldListForPOST.GetEntry(this.Description, "Description"); 
       AdaptedControlResult login = fieldListForPOST.GetEntry(this.Login, "Login"); 
       AdaptedControlResult acct = fieldListForPOST.GetEntry(this.Account, "Account"); 
       AdaptedControlResult fund = fieldListForPOST.GetEntry(this.Fund, "Fund"); 
       AdaptedControlResult org = fieldListForPOST.GetEntry(this.Org, "Org"); 

       AdaptedControlResult source_code = fieldListForPOST.GetEntry(this.Source_Code, "Source_Code"); 

       String post = 
        "First_Name=" + firstname.Value + 
        "&Last_Name=" + lastname.Value + 
        "&Billing_Address=" + billingaddress.Value + 
        "&Billing_City=" + billingcity.Value + 
        "&Billing_State=" + billingstate.Value + 
        "&Billing_Zip=" + billingzip.Value + 
        "&Billing_Phone=" + billingphone.Value + 
        "&Email=" + email.Value + 
        "&Amount=" + amount.Value + 
        "&Description=" + desc.Value + 
        "&Login=" + login.Value + 
        "&Account=" + acct.Value + 
        "&Fund=" + fund.Value + 
        "&Org=" + org.Value + 
        "&Invoice_Num=" + "DVXXXX"; 

       resultReturn = sendPost(url.ToString(), post); 

       return resultReturn; 

      } 

      public String sendPost(string url, string post) 
      { 

       String result = ""; 

       HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url); 
       objRequest.Method = "POST"; 
       // Set credentials to use for this request. 
       objRequest.Credentials = CredentialCache.DefaultCredentials; 

       // Convert POST data to a byte array.   
       byte[] byteArray = Encoding.UTF8.GetBytes(post); 

       // Set the ContentLength property of the WebRequest. 
       objRequest.ContentLength = byteArray.Length; 
       // Set the ContentType property of the WebRequest. 
       objRequest.ContentType = "application/x-www-form-urlencoded"; 
       // Get the request stream. 
       Stream dataStream = objRequest.GetRequestStream(); 
       // Write the data to the request stream. 
       dataStream.Write(byteArray, 0, byteArray.Length); 
       // Close the Stream object. 
       dataStream.Close(); 
       // Get the response. 
       WebResponse response = objRequest.GetResponse();      
       // Get the stream containing content returned by the server. 
       dataStream = response.GetResponseStream(); 
       // Open the stream using a StreamReader for easy access. 
       StreamReader reader = new StreamReader (dataStream); 
       // Read the content. 
       result = reader.ReadToEnd(); 

       // Clean up the streams. 
       reader.Close(); 
       dataStream.Close(); 
       response.Close(); 
       return result;  


      } 



      public string First_Name { get; set; }  
      public string Last_Name { get; set; }  
      public string Billing_Address { get; set; } 
      public string Billing_City { get; set; } 
      public string Billing_State { get; set; } 
      public string Billing_Zip { get; set; } 
      public string Billing_Phone { get; set; } 
      public string Email { get; set; } 
      public string Amount { get; set; } 
      public string Description { get; set; } 
      public string Login { get; set; } 
      public string Account { get; set; } 
      public string Fund { get; set; } 
      public string Org { get; set; } 
      public string Invoice_Num { get; set; } 
      public string Source_Code { get; set; } 

     } 


    } 

回答

0

你为什么要使用WFFM的形式,如果你不想调用任何的WFFM功能? WFFM的要点是允许标记人员在没有任何开发人员输入的情况下创建自己的表单。您必须编辑代码中的所有发布数据,这几乎消除了任何人无需开发人员输入即可编辑表单的功能。我会说,如果您要完成编写所有代码以手动提交代码的过程,则可以使用Sitecore项目创建表单,然后使用自己的代码进行处理。跳过WFFM。按照您的建议做事情要比手动创建表单要多得多。

如果您确实需要任何WFFM末端功能,您可以轻松地调用它们......它比尝试覆盖WFFM基本功能以注入您自己的功能还要方便。

+0

为了缓解您的担忧...... * – foxtrotZulu 2012-04-04 13:19:36

+0

命令模板已创建并部署,以复制我的基本表单。因此,当用户点击付款表单时,他们会在其网站根目录w /新ID中创建基本付款表单。问题是关于发布到外部URL的具体问题。顺便说一下,当开发人员必须为营销人员提供解决方案时,覆盖是一种常见做法,在我们的情况下,这种解决方案需要这种解决方案。请告诉我如何在不使用WFFM的情况下在表单标签中创建输入类型字段。 – foxtrotZulu 2012-04-04 13:36:35

+0

如果我碰到无礼,我表示歉意。我不是故意的。在我看来,根据你的要求,你基本上是编写你自己的代码来处理表单提交,而不是使用任何WFFM功能。 – divamatrix 2012-04-04 21:41:31