2009-11-06 63 views
9

可能是一個愚蠢的問題,但這裏有。在我看來,我有以下的代碼....避免ASP.NET MVC中的意大利麪代碼

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Learner.MvcApplication.ViewModels.PagerViewModel>" %><% 

for (int i = Model.StartPage; i <= Model.EndPage; i++) 
{ 
    %> 
    <% =Html.Label(ViewData.Model.Controller + i.ToString()) %> 
    <% 
} %> 

我一定要關閉,隨時待命,以重新Html.Label「%> <%」等?

我寧願做這樣的事情......

for (int i = Model.StartPage; i <= Model.EndPage; i++) 
{ 
    Html.Label(ViewData.Model.Controller + i.ToString()); 
} 

...但沒有被顯示的標籤。

你能猜到我是新手嗎?

非常感謝,

ETFairfax。

+10

而在主題命名的獎去.. *擊鼓聲* .....別人。 – 2009-11-06 12:57:24

回答

26

<%=x %>僅僅是Response.Write(x)快捷方式:

for (int i = Model.StartPage; i <= Model.EndPage; i++) 
{ 
    Response.Write(Html.Label(ViewData.Model.Controller + i.ToString())); 
} 
+0

正確的解決方案,但一些解釋性文字將有所幫助。 – AnthonyWJones 2009-11-06 13:18:37

+0

@AnthonyW瓊斯,我認爲這段代碼很自我解釋。單行代碼勝過千言萬語,但我同意你的看法,在這種情況下,一些解釋性文字可能會有所幫助。 – 2009-11-06 13:21:28

+1

+1但你的意思是%><%=x%><%是Response.Write(x)的快捷方式; OR <%=x%>是<$ Response.Write(x);%>的快捷方式? ;) – AnthonyWJones 2009-11-06 13:36:59

7

這只是一個短暫的標籤<%=<% Response.Write<%<%=

所以,你很可能把它寫這樣的區別:

for (int i = Model.StartPage; i <= Model.EndPage; i++) 
{ 
    Response.Write(Html.Label(ViewData.Model.Controller + i.ToString())); 
} 

有人可能會說哪個更好..

4

此處的關鍵是瞭解<%某些代碼%>和<%=某些代碼%>之間的差異。 <%一些代碼%>意味着只執行「一些代碼」。 < =某些代碼%>表示執行一些代碼並將返回值放入響應中。這就是Darin上面的答案使用Response.Write的原因。

3

已經給出了正確答案(至少兩次)。但是有些細節值得指出。 Fundementally,

<% stuff here %> 

意味着執行包含聲明用「的東西在這裏」使用默認的語言表示。鑑於: -

<%=stuff here %> 

手段評估由「這裏的東西」使用默認的語言所代表的含字符串表達式並將結果發送到響應。

這是一個常見的問題。是這樣的: -

<%="Hello, World!"%> 

與此相同: -

<%Response.Write("Hello, World!")%> 

答:沒有。注意第一個是一個表達式,並且不以a;結尾。而第二個是一個語句,將是一個語法錯誤。它有;失蹤。

0

另一個建議是創建將採取啓動和尾頁的參數定製的HtmlHelper。在助手,你應該做這樣的事情:

public static string Pager<TModel>(this HtmlHelper<TModel> html, Func<TModel, string> Prefix, int StartPage, int EndPage) where TModel : class 
    { 
     var builder = new StringBuilder(); 

     for (var i = StartPage; i <= EndPage; i++) 
      builder.Append(html.Label(Prefix.Invoke(html.ViewData.Model) + i)); 

     return builder.ToString(); 
    } 

測試(請注意,我用的MvcContrib TestControllerBuilder和RhinoMocks:

[Test] 
     public void Pager_should_be_ok() 
     { 
      var testBuilder = new TestControllerBuilder(); 
      var controller = new TestController(); 

      testBuilder.InitializeController(controller); 

      var viewData = MockRepository.GenerateStub<IViewDataContainer>(); 
      viewData.ViewData = new ViewDataDictionary 
      { 
       Model = new TestObject { Key = "Test", Value = "Value" } 
      }; 

      var viewContext = new ViewContext { RouteData = new RouteData(), RequestContext = controller.ControllerContext.RequestContext }; 
      var html = new HtmlHelper<TestObject>(viewContext, viewData); 

      var output = html.Pager(x => x.Key, 1, 2); 

      Assert.That(output, Is.EqualTo("Test1Test2")); 
     } 

然後在您的視圖,您可以使用此類似:

<%= Html.Pager(x => x.Controller, Model.StartPage, Model.EndPage) %> 

所以這是避免你不想看到和這是可測試的意大利麪條代碼

+0

忘了提,我沒有Html.Label擴展方法,所以我的是很簡單的: 公共靜態字符串標籤(這個HTML的HtmlHelper,串輸入) { 返回輸入; } – 2009-11-06 13:56:35

2

也考慮切換到Razor view engine。你可以擺脫那些討厭的<%%>

for (int i = Model.StartPage; i <= Model.EndPage; i++) 
{ 
    %> 
    <% =Html.Label(ViewData.Model.Controller + i.ToString()) %> 
    <% 
} %> 

成爲

@for (int i = Model.StartPage; i <= Model.EndPage; i++) 
{   
    Html.Label(ViewData.Model.Controller + i.ToString())   
} 
+0

或者你可以只做 <% 對(INT I = Model.StartPage;我<= Model.EndPage;我++){ 回覆於(Html.Label(ViewData.Model.Controller + I。的ToString())); }%> – devlord 2012-02-04 00:24:44

相關問題