2012-05-10 15 views
6

He implementado una Extensión MVC para formatear los números en mi aplicación. Se basa en el código encontrado here. Y es el siguienteExpressionHelper.GetExpressionText (expresión) no devuelve el nombre de mi propiedad

public static MvcHtmlString DecimalBoxFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, double?>> expression, string format, object htmlAttributes = null) 
{ 
    var name = ExpressionHelper.GetExpressionText(expression); 
    double? dec = expression.Compile().Invoke(html.ViewData.Model); 
    var value = dec.HasValue ? (!string.IsNullOrEmpty(format) ? dec.Value.ToString(format) : dec.Value.ToString()): ""; 
    return html.TextBox(name, value, htmlAttributes); 
} 

Cuando llamo con la siguiente línea de sintaxis Razor

@Html.DecimalBoxFor(model => Model.PointAttributes[i].Data.Y,"0.000", new { @class = "span1 number" }) 

consigo una excepción porque la variable 'name' en mi extensión es una cadena vacía. He intentado cambiar la línea del nombre var a esto, pero solo me da el nombre de propiedad de 'Y' y no el completo 'Model.PointAttributes [i] .Data.Y' que necesito vincular al modelo para MVC.

var name = ((expression.Body is MemberExpression ?((MemberExpression)expression.Body).Member : ((MemberExpression)((UnaryExpression)expression.Body).Operand).Member)).Name; 

Respuesta

6

Este es un comportamiento conocido. Me he dado cuenta de que estoy escribiendo mi propia versión de ExpressionHelper que maneja ese caso específico. Ahora usted tiene dos opciones:

  1. utilizar el paquete NuGet:

    Install-Package Mariuzzo.Web.Mvc.Extras 
    
  2. o simplemente tomar the source code of the aforementioned ExpressionHelper y pegarlo en su proyecto.

+0

Gracias @AarolamaBluenk, tomaré en cuenta su sugerencia, y definitivamente me mejoraré. Gracias de nuevo. –

+0

Nos encontramos con esto y esto funcionó perfectamente para nosotros. ¡Gracias! –

0

Si se puede salir sin usar un tipo anulable parece que funciona (es decir, eliminar el? Después del doble, o como en mi caso decimal). Así

Expression<Func<TModel, double?>> 

convierte

Expression<Func<TModel, double>>. 

Si das un paso a través de él con el tipo anulable en su lugar podrás ver la expresión tiene una función de conversión() en ella, que parece ser el 'problema'. Estoy seguro de que a mí también le interesaría saber cómo hacer que esta función funcione para los tipos que aceptan nulos.

+0

Por desgracia, es necesario que haya un anulable tipo. – PlTaylor

8

Trate de usar esta función:

static public string GetExpressionText(LambdaExpression p) 
    { 
     if (p.Body.NodeType == ExpressionType.Convert || p.Body.NodeType == ExpressionType.ConvertChecked) 
     { 
      p = Expression.Lambda(((UnaryExpression)p.Body).Operand, 
       p.Parameters); 
     } 
     return ExpressionHelper.GetExpressionText(p); 
    } 
+1

Esta respuesta me llevó a la solución, y creé/lancé [Mariuzzo.Web.Mvc.Extras] (https://github.com/rmariuzzo/Mariuzzo.Web.Mvc.Extras) –

0

Sé que está cerrado, pero para el registro;

Eso se maneja mejor con una plantilla, por lo que puede especificar qué tipo de datos está utilizando en el modelo y cómo se representa en la plantilla (responsabilidad única). Además, no necesitará modificar el marco MVC.

MSDN UiHint attribute

1

Aquí, un 'híbrido' una :)

public static void AddModelError<TModel>(this ModelStateDictionary state, Expression<Func<TModel, object>> expression, string message) 
    { 
     LambdaExpression lambdaExpression = null; 
     string fieldName = string.Empty; 

     if (expression.Body.NodeType == ExpressionType.Convert || expression.Body.NodeType == ExpressionType.ConvertChecked) 
     { 
      lambdaExpression = Expression.Lambda(((UnaryExpression)expression.Body).Operand, expression.Parameters); 
      fieldName = ExpressionHelper.GetExpressionText(lambdaExpression); 
     } else { 
      fieldName = ExpressionHelper.GetExpressionText(expression); 
     } 

     state.AddModelError(fieldName, message); 
    } 

Este es más compacto y probablemente una mejor solución:

https://stackoverflow.com/a/12689563/951001

Cuestiones relacionadas