MVC 4将视图模型传递给控制器​​ - 使用JavaScriptSerializer反序列化复杂的JSON对象

时间:2014-03-09 10:46:46

标签: c# asp.net-mvc json asp.net-mvc-viewmodel

我正在尝试将JSON对象反序列化为强类型的.net对象/ Type。这是我想从JSON

创建的对象
[Serializable]
public class CartItem
{
    [Key]
    public int Id { get; set; }
    public virtual Product Product { get; set; }
    public virtual List<SelectedProductOption> SelectedProductOptions { get; set; }
    public virtual Cart Cart { get; set; }
    public int Quantity { get; set; }
}

所以你有完整的图片,我也将发布组成CartItem的其他对象的定义,但是记住它的CartItem我想最终以

结束
[Serializable]
public class Product
{
    [Key]
    public int Id { get; set; }
    public string ProductName { get; set; }
    public decimal Price { get; set; }
    public virtual Category Category { get; set; }
}


[Serializable]
public class Category
{
    [Key]
    public int Id { get; set; }
    public string CategoryName { get; set; }
    public string ImageURL { get; set; }
}

在我的CartItem对象中,我有一个SelectedProductOption的集合(这就是我遇到的问题)这是SelectedProductOption的定义

[Serializable]
public class SelectedProductOption
{
    public Option Option { get; set; }
    public AllowedOptionValue Value { get; set; }
}
    [Serializable]
public class Option
{
    [Key]
    public int Id { get; set; }
    public string OptionName { get; set; }
    public virtual OptionGroup OptionGroup { get; set; }
}

    [Serializable]
    public class AllowedOptionValue
{
    [Key]
    public int Id { get; set; }
    public virtual Option Option { get; set; }
    public string OptionValue { get; set; }
    public string OptionCaption { get; set; }
    public decimal? PriceOffSet { get; set; }
    public bool? IsPercentageOffSet { get; set; }
 }

现在这是我尝试序列化的JSON对象

{\"Product\":{\"Id\":1,\"Price\":3.5,\"ProductName\":\"Rice Meal One\",\"Category\":         {\"Id\":1,\"CategoryName\":\" Rice Meals\",\"ImageURL\":\" \"},\"SelectedProductOptions\":[{\"Option\":{\"Id\":1,\"OptionName\":\"OptionName1\",\"OptionGroup\":{\"Id\":1,\"OptionGroupName\":\"Option Group\"}},\"Value\":{\"Id\":1,\"Option\":{\"Id\":4,\"OptionName\":\"OptionName2\",\"OptionGroup\":{\"Id\":1,\"OptionGroupName\":\"Option Group2\"}},\"OptionValue\":\"12123123\",\"OptionCaption\":\"12123123\",\"PriceOffSet\":3.2,\"IsPercentageOffSet\":true}},{\"Option\":{\"Id\":1,\"OptionName\":\"dsa\",\"OptionGroup\":{\"Id\":1,\"OptionGroupName\":\"asdas\"}},\"Value\":{\"Id\":1,\"Option\":{\"Id\":1,\"OptionName\":\"dsa\",\"OptionGroup\":{\"Id\":1,\"OptionGroupName\":\"asdas\"}},\"OptionValue\":\"12123123\",\"OptionCaption\":\"12123123\",\"PriceOffSet\":3.2,\"IsPercentageOffSet\":true}}]}}

所以当我打电话时:

CartItem cartItem = js.Deserialize<CartItem>(formData); 

CartItem.Product具有正确的值 CartItem.Product.Category具有正确的值

CarItem.SelectedProductOptions为null ...

我哪里错了?唯一没有工作的房产,有关如何解决的任何想法?

1 个答案:

答案 0 :(得分:0)

没有必要手动执行,asp.net MVC将为您完成:)

在视图中创建一个包含所有必填字段的表单:

@model CartItem;

<form action="/mycontroller/myaction">

    @Html.TextBoxFor(m => mode.ProductName)
    ...

    <button type=submit>OK</button>    
</form>

并定义您的控制器操作,如:

[HttpPost]
public ActionResult myaction(CartItem carItem)
{
 ...
}

carItem对象应包含您在视图中输入的所有数据