2010-08-31 22 views
6

Estoy convirtiendo una aplicación ASP.NET MVC para ASP.NET MVC 2 4.0, y recibe este error:operador '+' no se puede aplicar a operandos de tipo MvcHtmlString

Operator '+' cannot be applied to operands of type 'System.Web.Mvc.MvcHtmlString' and 'System.Web.Mvc.MvcHtmlString'

HTML = Html.InputExtensions.TextBox(helper, name, value, htmlAttributes) 
     + Html.ValidationExtensions.ValidationMessage(helper, name, "*"); 

¿Cómo puede ser esto ser remediado?

Respuesta

5

No se pueden concatenar instancias de MvcHtmlString. Necesitarás convertirlos a cadenas normales (a través del .ToString()) o hacerlo de otra manera.

Se puede escribir un método de extensión, así, ver esta respuesta para un ejemplo: How to concatenate several MvcHtmlString instances

+0

Soy nuevo en MVC, aquí está el código: pública ExTextBox cadena estática (este helper HtmlHelper, nombre de la cadena, el valor del objeto, bool readOnly, htmlAttributes objeto) { cadena HTML = ""; // if (readOnly) HTML = String.Format ("", nombre, valor); if (readOnly) HTML = value == null? "": valor.ToString(); else HTML = System.Web.Mvc.Html.InputExtensions.TextBox (helper, name, value, htmlAttributes) + System.Web.Mvc.Html.ValidationExtensions.ValidationMessage (helper, name, "*"); devolver HTML; } – hncl

+0

Muchas gracias, funcionó – hncl

+0

@hnabih: Si esta es la respuesta correcta, no olvide marcarlo como tal :) –

4

Personalmente utilizo un método de utilidad muy delgada, que aprovecha las ventajas del método de concatenación existente() de la clase String:

public static MvcHtmlString Concat(params object[] args) 
{ 
    return new MvcHtmlString(string.Concat(args)); 
} 
+0

Buen trabajo, me gusta –

0

Aquí es mi manera:

 // MvcTools.ExtensionMethods.MvcHtmlStringExtensions.Concat 
     public static MvcHtmlString Concat(params MvcHtmlString[] strings) 
     { 
      System.Text.StringBuilder sb = new System.Text.StringBuilder(); 

      foreach (MvcHtmlString thisMvcHtmlString in strings) 
      { 
       if (thisMvcHtmlString != null) 
        sb.Append(thisMvcHtmlString.ToString()); 
      } // Next thisMvcHtmlString 

      MvcHtmlString res = MvcHtmlString.Create(sb.ToString()); 
      sb.Clear(); 
      sb = null; 

      return res; 
     } // End Function Concat 
0
 public static MvcHtmlString Concat(params MvcHtmlString[] value) 
     { 
      StringBuilder sb = new StringBuilder(); 
      foreach (MvcHtmlString v in value) if (v != null) sb.Append(v.ToString()); 
      return MvcHtmlString.Create(sb.ToString()); 
     } 
1

@A método de nders como método de extensión. Lo bueno de esto es que puede agregar varias cadenas MvcHtmlStrings junto con otros valores (por ejemplo, cadenas normales, entradas, etc.) ya que el sistema llama automáticamente a ToString al objeto.

/// <summary> 
    /// Concatenates MvcHtmlStrings together 
    /// </summary> 
    public static MvcHtmlString Append(this MvcHtmlString first, params object[] args) { 
     return new MvcHtmlString(string.Concat(args)); 
    } 

Ejemplo de llamada:

MvcHtmlString result = new MvcHtmlString(""); 
MvcHtmlString div = new MvcHtmlString("<div>"); 
MvcHtmlString closediv = new MvcHtmlString("</div>"); 

result = result.Append(div, "bob the fish", closediv); 
result = result.Append(div, "bob the fish", closediv); 

Sería mucho más agradable si podríamos sobrecargar el operador +

+2

Parece que su método 'Append' descarta el parámetro' first'. – recursive

+0

De hecho. Debería usar 'return new MvcHtmlString (first + string.Concat (args))'. – Andrew

0

trabajando fuera del ejemplo de @ Mike Nelson Esta fue la solución que funcionó mejor para mí:

No hay necesidad de métodos adicionales de ayuda. Dentro de su archivo de afeitar hacer algo como:

@foreach (var item in Model) 
{ 
    MvcHtmlString num = new MvcHtmlString(item.Number + "-" + item.SubNumber); 
    <p>@num</p> 
} 
Cuestiones relacionadas