2011-01-03 15 views
5

Tôi gặp sự cố với ASP.Net MVC3 (RC2). Tôi nhận thấy rằng chức năng ràng buộc mô hình JSON mới, vốn ẩn chứa trong MVC3, không muốn deserialize thành một thuộc tính có kiểu enum.ASP.Net MVC3 - tại sao hỗ trợ mặc định cho mô hình JSON ràng buộc không giải mã thành các loại enum?

Dưới đây là một lớp học mẫu và enum loại:

public enum MyEnum { Nothing = 0, SomeValue = 5 } 
public class MyClass 
{ 
    public MyEnum Value { get; set; } 
    public string OtherValue { get; set; } 
} 

Xét đoạn mã sau, mà vượt qua thành công các đơn vị kiểm tra:

[TestMethod] 
public void Test() 
{ 
    var jss = new JavaScriptSerializer(); 
    var obj1 = new MyClass { Value = MyEnum.SomeValue }; 
    var json = jss.Serialize(obj1); 
    var obj2 = jss.Deserialize<MyClass>(json); 
    Assert.AreEqual(obj1.Value, obj2.Value); 
} 

Nếu tôi serialize obj1 trên, nhưng sau đó gửi dữ liệu đó để một bộ điều khiển MVC3 (ví dụ dưới đây) với một tham số kiểu MyClass, bất kỳ thuộc tính nào khác của đối tượng deserialize đúng, nhưng bất kỳ thuộc tính nào là một kiểu enumialize thành giá trị mặc định (zero).

[HttpPost] 
public ActionResult TestAction(MyClass data) 
{ 
    return Content(data.Value.ToString()); // displays "Nothing" 
} 

Tôi đã tải về mã nguồn MVC từ CodePlex nhưng tôi bối rối như nơi mã thực tế thực hiện deserialization xảy ra, có nghĩa là tôi không thể làm việc ra những gì các folks tại Microsoft đã sử dụng để thực hiện việc deserialization và do đó xác định nếu tôi đang làm điều gì đó sai hoặc nếu có một workaround.

Mọi đề xuất sẽ được đánh giá cao.

+0

Tôi đã thêm câu trả lời vào chuỗi này có thể hữu ích. http://stackoverflow.com/questions/6051756/model-binding-to-enums-in-asp-net-mvc-3/9070963#9070963 – Difinity

Trả lời

9

Tôi đã tìm thấy câu trả lời. Tôi hy vọng điều này là cố định trong MVC3 RTM, nhưng về cơ bản những gì xảy ra là đối tượng deserializes một cách chính xác trong nội bộ thông qua JsonValueProviderFactory, trong đó sử dụng JavaScriptSerializer để làm công việc. Nó sử dụng DeserializeObject() để nó có thể chuyển các giá trị trở lại bộ mô hình mặc định. Vấn đề là trình mô phỏng mặc định sẽ không chuyển đổi/gán giá trị int khi kiểu thuộc tính là một enum.

Có một cuộc thảo luận về điều này tại các diễn đàn ASP.Net đây:
http://forums.asp.net/p/1622895/4180989.aspx

Giải pháp thảo luận có ghi đè lên các mô hình mặc định chất kết dính như vậy:

public class EnumConverterModelBinder : DefaultModelBinder 
{ 
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) 
    { 
     var propertyType = propertyDescriptor.PropertyType; 
     if(propertyType.IsEnum) 
     { 
      var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
      if(null != providerValue) 
      { 
       var value = providerValue.RawValue; 
       if(null != value) 
       { 
        var valueType = value.GetType(); 
        if(!valueType.IsEnum) 
        { 
         return Enum.ToObject(propertyType, value); 
        } 
       } 
      } 
     } 
     return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder); 
    } 
} 

Sau đó, trong Application_Start, thêm dòng sau:

ModelBinders.Binders.DefaultBinder = new EnumConverterModelBinder(); 
+0

Sự cố này sẽ được khắc phục trong bản phát hành tiếp theo của ASP.NET MVC. – marcind

0

Bạn gọi hành động này như thế nào? Bạn đã thử:

$.post(
    '/TestAction', 
    JSON.stringify({ OtherValue : 'foo', Value: 5 }), 
    function(result) { 
     alert('ok'); 
    } 
); 
+0

Tôi không gọi nó từ trang web, tôi đang gọi nó từ một ứng dụng khác thông qua 'WebClient.UploadString()'. Quá trình đăng bài thực sự không hoạt động, nó chỉ là các thuộc tính enum của lớp không deserialize. Tất cả các tài sản khác đi qua chỉ là tốt. –

+0

@Nathan, bạn có thể vui lòng hiển thị mã gọi điện không? –

+0

Tôi đã tìm thấy sự cố; lớp DefaultModelBinder không chuyển đổi int thành Enums. http://forums.asp.net/p/1622895/4180989.aspx –

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