2009-11-06 15 views
9

Probablemente una pregunta estúpida, pero aquí va. En mi opinión, tengo el siguiente código ....Evitar el código de espagueti en 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()) %> 
    <% 
} %> 

¿Tengo que cerrar y volver a abrir alrededor de la llamada a Html.Label "%> <%", etc.?

Prefiero hacer algo como ...

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

... pero no se visualizan las etiquetas.

¿Puedes adivinar que soy nuevo en esto?

Muchas gracias,

ETFairfax.

+10

Y el premio en el Tema de denominación va a .. * * Redoble ..... otra persona. –

Respuesta

26

<%=x %> es sólo un atajo para Response.Write(x):

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

La solución correcta pero algún texto explicativo ayudaría. – AnthonyWJones

+0

@AnthonyWJones, pensé que el código es bastante auto explicativo. Una sola línea de código vale más que mil palabras, pero estoy de acuerdo con usted en que algún texto explicativo podría ser útil en este caso. –

+1

+1, pero ¿no te refieres a%><%=x%>? <% Es un atajo para Response.Write (x); O <%=x%> es un atajo para <$ Response.Write (x);%>? ;) – AnthonyWJones

7

esto es sólo un corto etiqueta <%= para <% Response.Write nota la diferencia entre <% y <%=

Así que bien podría escribir así:

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

Se podría argumentar cuál es más agradable ..

4

La clave aquí es comprender la diferencia entre <% algún código%> y <% = algún código%>. <% algún código%> significa simplemente ejecutar "algún código". <% = algún código%> significa ejecutar algún código y poner el valor de retorno en la respuesta. Esta es la razón por la que la respuesta anterior de Darin funciona usando Response.Write.

3

La respuesta correcta ya ha sido dada (al menos dos veces). Sin embargo, vale la pena señalar algunas sutilezas. Fundementally,

<% stuff here %> 

significa ejecutar los contenidos declaraciones representados por "cosas aquí", utilizando el idioma por defecto. Considerando lo siguiente: -

<%=stuff here %> 

medios evaluar la expresión de cadena contenida representado por "cosas aquí" usando el idioma predeterminado y enviar el resultado a la respuesta.

Aquí hay un gotcha común. Es la siguiente: -

<%="Hello, World!"%> 

lo mismo que esto: -

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

?

Respuestas: no. Tenga en cuenta que la primera es una expresión y no termina con un; Mientras que el segundo es un enunciado y será un error de sintaxis. Tiene el; desaparecido.

0

Otra sugerencia es crear un HtmlHelper personalizado que tome los parámetros Start y EndPage como parámetros.En el ayudante que debe hacer algo como esto:

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

de prueba (en cuenta que yo estoy usando MvcContrib TestControllerBuilder y 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")); 
     } 

A continuación, en su opinión, se puede utilizar esto como que:

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

Así que esto es evitar el código de espagueti que no quiere ver y esto es comprobable.

+0

Olvidé mencionar que no tenía el método de extensión Html.Label, así que el mío es muy simple: cadena estática pública Etiqueta (esta HtmlHelper html, entrada de cadena) { return input; } –

2

Considere también un cambio a Razor view engine. Usted puede deshacerse de esos molestos <%%>

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

convierte

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

o usted podría hacer <% for (int i = Model.StartPage; i <= Model.EndPage; i ++) { Response.Write (Html.Label (ViewData.Model.Controller + i. Encadenar())); }%> – devlord

Cuestiones relacionadas