【问题标题】:how do you go about dealing with ajax and Model Binding when complex types are involved?当涉及复杂类型时,您如何处理 ajax 和模型绑定?
【发布时间】:2009-07-16 14:42:53
【问题描述】:

我想在我的视图中进行 ajax 调用时保持模型绑定。我正在使用jquery ajax 进行调用,仅作为示例 - 这是我想从 ajax 调用的控制器方法:

public ActionResult Create(Person personToCreate) {
    //Create person here
}

如您所见,此方法依赖于Model Binding。这使得该方法更加简洁......但是,这意味着当 ajax 进行调用时,它必须提供数据库中不可为空的所有变量。

所以,如果我有一个名为 Person 且包含变量的表:

firstName varchar(25) not-null
lastName  varchar(25) not-null
myPet     int         not-null <-- This is a foreign key

然后,创建的实体框架类Person 将类似于:

public class Person {
   public string firstName { get; set; }
   public string lastName { get; set; }
   public Pet myPet { get; set; }
}

由于没有一个变量可以为空(在 DB 中指定),这意味着 ajax 调用必须提供 string firstNamestring lastNamePet myPet。但是javascript不能提供宠物...

所以我只有两个选择(据我所知):

  1. 允许 myPet 在 DB 中为空

  2. 创建一个“扁平”类来表示不需要宠物对象的 Person...

即:

public class SimplePerson {
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string myPetName { get; set; }
}

第一个选项的问题是,必须修改数据库似乎很奇怪......肯定有问题,因为它允许做不应该的事情......

第二个选项的问题是我有很多类,并且为每个类编写重复的类似乎很广泛,只是为了避免这种情况......如果我有 30 个类,那将是 30 个重复的类,我必须创建才能允许模型绑定。

谁能想到任何更好的选择,或说明为什么一种选择会比另一种更好?

【问题讨论】:

    标签: sql-server asp.net-mvc ajax model-binding complex-data-types


    【解决方案1】:

    这里真正的技巧是将视图模型类与实际模型类分开。视图模型类往往更简单一些,在对它们进行实际操作之前,您需要将它们映射回您的实际模型类。不过,AutoMapper 之类的工具让这一切变得轻而易举。

    【讨论】:

    • “将你的视图模型类与实际模型类分开”所以你的意思是我应该简化每个类的副本?
    • 是的,用于映射进出表单等的简化类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多