【问题标题】:Help with asp.net mvc form with multiple models使用多个模型的 asp.net mvc 表单帮助
【发布时间】:2011-02-22 19:19:53
【问题描述】:

我在弄清楚如何做到这一点时遇到了一些麻烦。

这是我的场景

User 必须为他的Business 创建一个IncomeDeclaration

但是IncomeDeclaration 包含许多ActivityIncomeDeclarations,对应于他的业务所在的每个Activity

我希望我的表单包含新的IncomeDeclaration 的字段以及ActivityIncomeDeclarations 的字段(显然与IncomeDeclaration 相关)......

我知道 ruby​​onrails 有一个名为“accepts_nested_attributes_for”的方法,tgat 可能会在这里帮助我..

请帮忙!

【问题讨论】:

  • 你的意思是继承吗?
  • no.. 许可证 has_many 活动... 许可证 has_many(IncomeDeclarations.. 每年).. 每个 IncomeDeclaration 也将有许多活动,因为贡献者必须在他时提供每个活动的具体细节声明

标签: asp.net asp.net-mvc nested nested-forms nested-attributes


【解决方案1】:

这很容易实现。 ASP NET MVC 是非常组合的,您可以使用模板来实现这一点,但继承不是要走的路。

所以解决方案是让IncomeDeclaration 包含ActivityIncomeDeclarations 的列表,然后执行以下操作:

for(int  i=0; i< Model.Activities.Count; i++)
{
    Html.EditorFor(Model.Activities[i]);  // you need an editor template (and a display template)  for ActivityIncomeDeclarations
}

更多信息:

http://www.asp.net/mvc/videos/mvc2-template-customization http://www.dalsoft.co.uk/blog/index.php/2010/04/26/mvc-2-templates/

【讨论】:

  • 好吧。这适用于显示现有的IncomeDeclaration 活动以进行编辑。但是,如果用户决定删除其中一个或添加一些新的怎么办?当然,如果您知道该怎么做,这是可能的,但它绝对不再是微不足道的了。
  • 不过我有一个问题...... Create Action 怎么知道保存所有这些数据??.. 现在我的 Create action 只接收两个参数,int LicenseId 和 IncomeDeclaration income.. Im不确定保存 IncomeDeclaration 是否也会保存所有这些 ActivityIncomeDeclarations
【解决方案2】:

我的这篇博文可以帮助你很多:

Asp.net MVC model binding to List<T>

但基本上你会为你的IncomeDeclaration 提供字段,然后根据需要动态添加ActivityIncomeDeclaration 字段。

如果您想实际序列化表单,您必须按照上面博客文章中提供的说明进行操作。

但如果你使用 jQuery,还有第二个选择。您可以操作一个复杂的 JavaScript 对象,该对象将是同一服务器端 C# 类的副本,例如:

var incDec = {
    Name: ""
    // and other properties
    ActivityIncomeDeclarations: []
};

然后,当用户添加那些 ActivityIncomeDeclarations 时,您总是只需调用

incDec.ActivityIncomeDeclarations.push({
    // properties
});

然后我的另一篇博文将帮助您将此对象转换为字典,例如 jQuery 可以轻松处理:

Sending complex JSON objects to Asp.net MVC using jQuery

通过使用 prlogin 博客文章,您可以轻松做到:

$.ajax({
    url: "someURL",
    type: "POST",
    data: $.toDictionary(incDec),
    success: function(data, status, xhr){
        // process success
    },
    error: function(xhr, status, err){
        // process error
    }
});

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多