2013-01-09 88 views
2

一個渲染與空action屬性(或根本沒有)

使用下面的代碼:

<form id="form1" action="" runat="server"> 

(即使有這樣的代碼隱藏在頁面加載:form1.Action = string.Empty;

...這是意想不到的結果,我得到:

<form method="post" id="form1" name="form1" action="layouts/Default.aspx"> 

這是預期的結果,我想您的幫助來完成:

<!-- either action="" or no action attribute at all --> 
<form method="post" id="form1" name="form1" action=""> 

AppPool設置爲運行Integrated .NET v2.0.50727(我已通過打印運行時版本進行了驗證)。 .NET Framework v4.5安裝在服務器上(與Visual Studio 2012一起)。

這是保證是某種開發環境問題,原因是兩個我的同事在他們的本地環境中輸出action=""的代碼相同。他們大多具有相同的系統環境規格爲我做的:

  • 的Windows Server 2008 R2 64位
  • 的Visual Studio 2012
  • 的.NET Framework V4.5
  • 相同的應用程序池設置(我們已經雙重和三重檢測)
  • 相同的代碼(SVN控制),包括完全相同的web.config

This在ASP.NET v3.5 SP1(這在v4.0中更好地宣佈)中發生了重大變化。它解釋了行爲。但是,這並不能解釋爲什麼只有我的運行時才能得到這個突破性的改變。

另外請注意,我已經嘗試使用aspnet_regiis工具(無果)從不同的.NET版本的文件夾和卸載/重新安裝和命令,即所有可用的組合使用-c-i

+0

**注**:在'佈局背後的原因/ Default.aspx'是我'使用Sitecore CMS – Simeon

+0

** Note2 **:沒有JS解決方案感興趣 – Simeon

+0

我認爲你不能取出'runat =「server」'你能嗎? – Earlz

回答

0

以下醜陋解決方法是迄今爲止我找到的唯一解決方案。爲了刪除override void RenderBeginTag上的動作屬性,我正在對錶單進行子類化。

[ToolboxData("<{0}:HtmlFormNoAction runat=\"server\"></{0}:HtmlFormNoAction>")] 
public class HtmlFormNoAction : HtmlForm 
{ 
    protected override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     var htmlString = new StringBuilder(); // this will hold the string 
     var stringWriter = new StringWriter(htmlString); 
     var htmlWriter = new HtmlTextWriter(stringWriter); 
     base.RenderBeginTag(htmlWriter); 
     htmlWriter.Flush(); 
     var formBeginTag = htmlString.ToString(); 
     var formBeginTagWithoutAction = RemoveActionAttribute(formBeginTag); 

     writer.Write(formBeginTagWithoutAction); 
    } 

    private string RemoveActionAttribute(string formBeginTag) 
    { 
     const string actionStart = "action=\""; 
     if (!formBeginTag.Contains(actionStart)) 
      return formBeginTag; 

     var start = formBeginTag.IndexOf(actionStart); 
     var end = formBeginTag.IndexOf("\"", start + actionStart.Length); 
     return formBeginTag.Substring(0, start) + formBeginTag.Substring(end + 1); 
    } 
} 
0

檢查:https://msdn.microsoft.com/en-us/library/ms972974.aspx

namespace ActionlessForm { 
    public class Form : System.Web.UI.HtmlControls.HtmlForm 
    { 
    protected override void RenderAttributes(HtmlTextWriter writer) 
    { 
     writer.WriteAttribute("name", this.Name); 
     base.Attributes.Remove("name"); 

     writer.WriteAttribute("method", this.Method); 
     base.Attributes.Remove("method"); 

     this.Attributes.Render(writer); 

     base.Attributes.Remove("action"); 

     if (base.ID != null) 
      writer.WriteAttribute("id", base.ClientID); 
    } 
    } 
} 

而且也是這樣的:http://www.codeproject.com/Articles/19672/A-Smart-Form-Control-for-ASP-NET-URL-Rewriting