2012-05-10 16 views
6

Tôi đã triển khai một phần mở rộng MVC để định dạng các số trong ứng dụng của mình. Nó dựa trên mã được tìm thấy here. Và như sauExpressionHelper.GetExpressionText (biểu thức) không trả về tên tài sản của tôi

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

Khi tôi gọi nó với dòng sau của Razor cú pháp

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

tôi nhận được một ngoại lệ vì biến 'tên' trong phần mở rộng của tôi là một chuỗi rỗng. Tôi đã cố gắng thay đổi dòng var tên này nhưng nó chỉ mang lại cho tôi tên thuộc tính của 'Y' và không phải là đầy đủ 'Model.PointAttributes [i] .Data.Y' mà tôi cần phải ràng buộc mô hình trở lại cho MVC.

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

Trả lời

6

Đây là một hành vi được biết đến. Tôi đã tìm ra phiên bản của riêng mình ExpressionHelper xử lý trường hợp cụ thể đó. Bây giờ bạn có hai lựa chọn:

  1. Sử dụng các gói NuGet:

    Install-Package Mariuzzo.Web.Mvc.Extras 
    
  2. Hoặc chỉ cần lấy the source code of the aforementioned ExpressionHelper và dán nó vào dự án của bạn.

+0

Cảm ơn @AarolamaBluenk, tôi sẽ thực hiện trong tài khoản đề xuất của bạn, và chắc chắn sẽ cải thiện bản thân mình. Cảm ơn một lần nữa. –

+0

Chúng tôi chạy vào điều này và điều này làm việc hoàn hảo cho chúng tôi. Cảm ơn bạn! –

0

Nếu bạn có thể lấy đi mà không sử dụng loại vô hiệu, có vẻ như nó hoạt động (ví dụ: xóa? Sau khi tăng gấp đôi hoặc như trong số thập phân của tôi). Vì vậy,

Expression<Func<TModel, double?>> 

trở thành

Expression<Func<TModel, double>>. 

Nếu bạn bước qua nó với các loại nullable tại chỗ bạn sẽ thấy biểu thức có chức năng chuyển đổi() trong nó mà có vẻ là 'vấn đề'. Tôi chắc chắn như tôi, bạn sẽ được quan tâm đến cách làm cho chức năng này làm việc cho các loại nullable là tốt.

+0

Đáng tiếc là nó cần phải được một nullable kiểu. – PlTaylor

8

Hãy thử sử dụng chức năng này:

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

Câu trả lời này đưa tôi đến giải pháp và tôi đã tạo/phát hành [Mariuzzo.Web.Mvc.Extras] (https://github.com/rmariuzzo/Mariuzzo.Web.Mvc.Extras) –

0

Tôi biết nó đã đóng nhưng để ghi lại;

Được xử lý tốt hơn bởi mẫu để bạn có thể chỉ định loại dữ liệu bạn đang sử dụng trong mô hình và cách nó được thể hiện trong mẫu (trách nhiệm đơn). Ngoài ra, bạn sẽ không cần sửa đổi khung MVC.

MSDN UiHint attribute

1

Dưới đây là một 'lai' một :)

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

Cái này là nhỏ gọn hơn và có thể là một giải pháp tốt hơn:

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

Các vấn đề liên quan