2011-07-07 13 views
0

這可能是一個錯誤。重現步驟:ASP.NET MVC的HTML作家的錯誤?

(1)創建ASP.NET MVC 3項目(ASPX視圖引擎)

(2)進入Models文件夾,並創建一個新的簡單的模型

namespace MvcApp.Models 
{ 
    public class MyModel 
    { 
     public static string MyString = "foo";   
    } 
} 

( 3)修改web.config文件,添加模型的名稱空間,以便您可以在視圖中使用模型。

 .... 
     </controls> 
     <namespaces> 
     <add namespace="MvcApp.Models" /> 
     </namespaces> 
    </pages> 
    </system.web> 

(4)轉到/Shared/Site.Master,修改<head>部。

<head runat="server"> 
    <title><%: MyModel.MyString %><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 
    <link href="<%: MyModel.MyString %>" rel="<%: MyModel.MyString %>" /> 
    <script src="<%: MyModel.MyString %>" /> 
</head> 

runat="server"頭的屬性。

(5)運行它,並查看頁面的源代碼。我想你會得到(不必要的空格被刪除):

<head id="Head1"> 
    <title>foo Index</title> 
    <link href="&lt;%: MyModel.MyString %>" rel="&lt;%: MyModel.MyString %>" /> 
    <script src="foo" /> 
</head> 

一件趣事:

一個。 link標記的所有屬性未被正確評估。它看起來像被編碼?而titlescript中的表達式是正確的。

b。第3行改成這樣:

<link href="<%: MyModel.MyString %>" rel="<%: string.Format("{0}", "foo") %>" /> 

OR

<link href="<%: MyModel.MyString %>" rel="<%: "foo" %>" /> 

你會得到一切正確的(甚至href是正確的!)。

c。 head沒有runat="server"總是正確的。

我認爲這是將視圖呈現給html文本時的錯誤。檢查源代碼並嘗試查找錯誤真的是一場噩夢。誰能告訴我理由?

回答

1

簡單的原因是ASP.NET服務器控件從未轉換<%%>標籤。由於您的Head包含runat =「server」,因此ASP.NET Web Form Engine需要爲每個子控件做出一些內部決定,以確定是否使其成爲Web服務器控件。

把這個

<head id="Head1" runat="server"> 
<title><%: MyModel.MyString %><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 
<link id="link1" href="<%: MyModel.MyString %>" rel="<%: MyModel.MyString %>" /> 
<link id="link2" href="<%: MyModel.MyString %>" rel="<%: string.Format("{0}", "foo") %>" /><%sa %> 
<script src="<%: MyModel.MyString %>" /> 
</head> 

<script src="<%: MyModel.MyString %>" /> 

現在仔細檢查顯示完整的編譯來源:

+1

更多,我認爲這是一個不相關的問題 - 如果它可以永遠根本沒有考慮到問題。爲什麼要堅持使用aspx語法和「runat = server」這些東西,這些東西是webforms的遺留物,當我們爲Mvc設計本地Razor時,並且在每個方面都更好? –

+0

@Matteo Mosca:在ASP.NET MVC中使用'runat =「server」'是有意義的。否則,我們如何使用''使用母版頁? –

+0

看起來像你只讀了我評論的一半。我正在談論剃刀。您不要在Razor中使用標籤,它具有不同(並且完全更好)的語法。你仍然有不同的和更優雅的方式,像masterpages等概念。 –