2009-11-06 2 views
9

Probabilmente una domanda stupida, ma qui va. A mio parere, ho il seguente codice ....Evitare il codice spaghetti in 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()) %> 
    <% 
} %> 

Devo chiudere e riaprire intorno la chiamata a Html.Label "%> <%", ecc?

Preferirei mille volte fare qualcosa di simile ...

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

... ma non vengono visualizzati le etichette.

Riesci a indovinare che sono nuovo a questo ??

Molte grazie,

ETFairfax.

+10

E il premio in Topic-Naming va a .. * Rullo di tamburi * ..... qualcun altro. –

risposta

26

<%=x %> è solo una scorciatoia per Response.Write(x):

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

La soluzione corretta, ma un testo esplicativo potrebbe aiutare. – AnthonyWJones

+0

@AnthonyWJones, ho pensato che il codice fosse piuttosto auto-esplicativo. Una singola riga di codice vale migliaia di parole, ma sono d'accordo con te sul fatto che alcuni testi esplicativi potrebbero essere utili in questo caso. –

+1

+1 ma non intendi%><%=x%><% è una scorciatoia per Response.Write (x); O <%=x%> è una scorciatoia per <$ Response.Write (x);%>? ;) – AnthonyWJones

7

questo è solo un breve tag <%= per <% Response.Write nota la differenza tra <% e <%=

Così si potrebbe benissimo scrivere in questo modo:

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

Si potrebbe discutere quale sia più bello ..

4

La chiave qui è capire la differenza tra <% un po 'di codice%> e <% = un po' di codice%>. <% un po 'di codice%> significa solo eseguire "un po' di codice". <% = codice%> significa eseguire un codice e inserire il valore restituito nella risposta. Questo è il motivo per cui la risposta di Darin sopra funziona utilizzando Response.Write.

3

La risposta corretta è già stata data (almeno due volte). Tuttavia alcuni sottotitoli meritano di essere segnalati. Fundementally,

<% stuff here %> 

significa eseguire i contenuti dichiarazioni rappresentate da "roba qui" utilizzando la lingua predefinita. Considerando quanto segue: -

<%=stuff here %> 

mezzi valutare il contenuto stringa di espressione rappresentato da "roba qui" utilizzando la lingua predefinita e inviare il risultato alla risposta.

Ecco un trucco comune. È questo: -

<%="Hello, World!"%> 

lo stesso di questo: -

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

?

Ans: no. Nota il primo è un'espressione e non è terminato con un; Mentre il secondo è un'affermazione e sarà un errore di sintassi. Ha il; mancante.

0

Un altro suggerimento è quello di creare un HtmlHelper personalizzato che utilizzi Start e EndPage come parametri.Nel Prepara si dovrebbe fare qualcosa di simile:

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

Test (notare che io sto usando MvcContrib TestControllerBuilder e 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")); 
     } 

Poi a suo avviso è possibile utilizzare questo genere:

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

Quindi questo è evitare il codice spaghetti che non si desidera vedere e questo è verificabile

+0

Ho dimenticato di non avere il metodo di estensione Html.Label, quindi il mio è molto semplice: etichetta stringa statica pubblica (questo html HtmlHelper, input stringa) { input di ritorno; } –

2

Considerare anche un passaggio a Razor view engine. È possibile liberarsi di quei fastidiosi <%%>

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

diventa

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

o si può solo fare <% for (int i = Model.StartPage; i <= Model.EndPage; i ++) { Response.Write (Html.Label (ViewData.Model.Controller + i. Accordare())); }%> – devlord