【问题标题】:ASP .NET MVC Parent-child view model bindingASP .NET MVC 父子视图模型绑定
【发布时间】:2012-03-25 07:48:55
【问题描述】:

我正在开发 MVC 应用程序,我的模型中有以下类:

public class Member 
{
    [Required]
    public string Name {get;set;}
    public virtual ICollection AgeBrackets{ get;set;}
}

public class AgeBracket
{
    [Required]
    public int MinAge {get;set;}

    [Required]
    public int MaxAge {get;set;}
    
    public virtual Member Member {get;set;}
}

在成员的创建/编辑视图中,我希望有一种父子视图:成员的通用编辑字段(名称)和与成员关联的 AgeBrackets 集合的部分视图。我希望能够使用 jQueryUI 对话框表单添加/编辑/删除 AgeBrackets 并更新客户端上的 agebrackets 列表。

问题是 - 我应该在哪里存储括号集合?

在整个会员表格发布之前,我不想将括号集合的任何更改发布到服务器。

我试图使用 knockout.js 来完成它。这似乎是最优雅的方式。是否可以仅将 knockout.js 用于 AgeBrackets 集合并保持 Member 绑定到 MVC 模型绑定,并在 Member post 期间以某种方式结合 Member-fields 和淘汰 AgeBracket 集合视图模型?

【问题讨论】:

  • 是否可以在成员控制器中有类似 public ActionResult Create(Member member, IEnumerable ageBrackets) 的东西?其中 IEnumerable ageBrackets 将是 knockout.js viewModel 和 Member 成员 - 常规 MVC 模型绑定

标签: asp.net-mvc model-view-controller knockout.js parent-child model-binding


【解决方案1】:

使用 KO 时,我发现使用纯 json 作为操作方法的输入和输出要容易得多。

如果您的客户端模型尽可能接近您的服务器端,事情会变得容易得多。如何填充此模型取决于您(手动编码、使用映射插件进行映射等)。假设您的 Member 客户端模型看起来像

var memberViewModel = function() {
    this.name = ko.observable("Alex");
    this.ageBrackets = ko.observableArray([
        { minAge: 15, maxAge: 20 },
        { minAge: 18, maxAge: 21 },
    ]);
};

那么你的action方法可以是

public JsonResult Create(Member member) {
    ....
}

当您点击创建按钮时,您会触发一个函数,该函数会将您的 memberViewModel 转换为 JSON,该 JSON 将被回发并自动映射到您的 Member 模型。

如果您最初使用映射插件,可以使用ko.toJSON(memberViewModel)ko.mapping.toJSON(memberViewModel) 转换为 JSON。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多