0

类别表:

ID => int,主键

类别名称 => varchar

ParentCategoryID => int ,可为空

生成以下json数据格式:

[{
    "id":1,
    "name":"Root",
    "Edit":"<a href='Edit/id'>edit.png</a>",
    "Delete":"<a href='Delete/id'>delete.png</a>",
    "children":[{
        "id":2,
        "name":"Horoscope",
        "Edit":"<a href='Edit/id'>edit.png</a>",
        "Delete":"<a href='Delete/id'>delete.png</a>",
        "children":[{
            "id":21,
            "name":"Daily",
            "Edit":"<a href='Edit/id'>edit.png</a>",
            "Delete":"<a href='Delete/id'>delete.png</a>",
            "children":[{
                "id":211,
                "name":"Aries",             
                "Edit":"<a href='Edit/id'>edit.png</a>",
                "Delete":"<a href='Delete/id'>delete.png</a>"
            },{
                "id":212,
                "name":"Taurus",                
                "Edit":"<a href='Edit/id'>edit.png</a>",
                "Delete":"<a href='Delete/id'>delete.png</a>"
            }]
        },{
            "id":22,
            "name":"Weekly",            
            "Edit":"<a href='Edit/id'>edit.png</a>",
            "Delete":"<a href='Delete/id'>delete.png</a>",
            "children":[{
                "id":221,
                "name":"Gemini",                
                "Edit":"<a href='Edit/id'>edit.png</a>",
                "Delete":"<a href='Delete/id'>delete.png</a>"
            },{
                "id":222,
                "name":"Aries",             
                "Edit":"<a href='Edit/id'>edit.png</a>",
                "Delete":"<a href='Delete/id'>delete.png</a>"
            },{
                "id":223,
                "name":"Taurus",            
                "Edit":"<a href='Edit/id'>edit.png</a>",
                "Delete":"<a href='Delete/id'>delete.png</a>"
            }]
        }]
    },{
        "id":3,
        "name":"News",      
        "Edit":"<a href='Edit/id'>edit.png</a>",
        "Delete":"<a href='Delete/id'>delete.png</a>",
        "children":[{
            "id":31,
            "name":"Sports",            
            "Edit":"<a href='Edit/id'>edit.png</a>",
            "Delete":"<a href='Delete/id'>delete.png</a>"
        },{
            "id":32,
            "name":"Interantional",         
            "Edit":"<a href='Edit/id'>edit.png</a>",
            "Delete":"<a href='Delete/id'>delete.png</a>"
        },{
            "id":33,
            "name":"Entertaintment",            
            "Edit":"<a href='Edit/id'>edit.png</a>",
            "Delete":"<a href='Delete/id'>delete.png</a>"
        }]
    }]
}]

我有需要以上 json 格式的 Jquery TreeGrid 插件。如何从数据库的类别表中生成上述 json 数据并在控制器操作中返回 json 数据。我已经为模型使用实体框架。

4

2 回答 2

1

我不会从混合数据和 UI 指令开始!它用多余的重复数据使 JSON 消息变得混乱。我认为由客户决定将数据放在哪里以及如何显示它们,否则您应该单独发送这些说明(例如,作为消息的第一部分)。

也就是说,完成这项工作的最简单方法是让你的类定义如下:

class Category
{
    public int Id { get; set; }
    public string CategoryName { get; set; }
    public int? ParentCategoryID { get; set; }
    [ForeignKey("ParentCategoryID")]
    public virtual ICollection<Category> SubCategories { get; set; }
}

当您使用 查询CategoriesParentCategoryID == null启用延迟加载并序列化为 JSON 时,您会看到所有级别都包含在内,因为每个级别都会Category发出一个查询以获取其子级。

请注意,Category它没有ParentCategory属性,因为这可能会导致 JSON 序列化由于循环引用而失败。

JavaScriptSerializer如果您不在 MVC API 控制器中,则可以使用序列化。

顺便提一句。做到这一点的最好方法是让你的域模型传输无知并使用CategoryDto对象结构。

于 2013-02-13T12:56:34.983 回答
0

我认为您需要在您的域类中有一个名为“Children”的属性,如下所示,

Category {

public int Id{get;set;}
public string CategoryName{get;set;}
public int ParentCategoryID {get;set;}
public Category ParentCategory {get;set;}

public virtual IList<Category > Children{get;set;}
}

然后您可以使用AutoMapper之类的映射器将这些模型映射到您的视图模型(其属性与您对 json 对象所需的属性相同)

于 2013-02-13T10:34:26.260 回答