1

我阅读了这个 q/a Real example of TryUpdateModel, ASP .NET MVC 3并且对@ben-foster 的响应非常感兴趣。

我开始对该答案发表评论,但时间很长,因此开始了一个新问题。

拥有适用于所有方法的 ViewModels(我非常喜欢)让我进入了一些“奇怪的场景”,我想要建议我应该怎么做。

想象一下这个结构:

public class ProductListEditableViewModel {
    List<ProductEditViewModel> products {get;set;}
}
public class ProductEditViewModel {
    List<PriceViewModel> prices {get;set;}
}

public class PriceViewModel {
    CurrencyViewModel currency {get;set;}
}

等等 ... ?你真的为每个内部类制作一个视图模型吗?那么如何将所有这些映射到模型对象?

此外,这涵盖了编辑,但我有一个添加,一个通过电子邮件发送,以及可能更多的视图,所以更多的视图模型!我应该像这样结束吗:

AddCurrencyViewModel QuickAddCurrencyViewModel EditCurrencyViewModel ListCurrencyViewModel DeleteCurrencyViewModel ShareCurrencyViewModel

都具有“几乎相同”的属性?

是否应该将所有这些打包到一个文件中?

我还需要所有这些视图模型还是继承方法可能会更好?

如果可以的话,我会很感激详细说明复杂的场景

此外,我使用 DTO 方法将一些模型对象公开到 Web 服务/api 中,所以我已经有了某种形式的映射,其中这个 DTO 不完全是我的 ViewModel,我应该删除其中一个吗?在这种情况下有什么建议?

我正在使用实体框架,但我认为问题是(或应该是)ORM 不可知论。不使用 UoW 模式(这会有帮助吗?),因为随着物体深度的增加,它看起来会变得更加复杂。

非常感谢!

4

2 回答 2

2

我们通常每个视图都有一个视图模型,所以是的,如果您有很多视图,那么您有很多视图模型。

在典型的 CRUD 应用程序中,我们经常有非常相似的视图,例如 Add 和 Update。在这些情况下,是的,我们使用继承而不是编写重复的代码——通常是添加子类更新。

public class AddFoo : UpdateFoo {
    public AddFoo() {
        // set up defaults for new Foo
    }
}

public class UpdateFoo {
    public string Name { get; set; }
    // etc.
}

过去,我们试图在视图之间“共享”视图模型,但通常会陷入痛苦的世界。

关于你的“奇怪的场景”——这确实看起来很奇怪,但也许是因为我不理解你的应用程序。

您的视图模型的目标是为视图提供所需的信息,并理想地展平任何复杂的对象,以便它们更易于使用。你不应该像你的例子那样拆分你的视图模型,除非这样做是有意义的。

假设我想创建一个视图,客户可以在其中更改他们的联系方式。采用以下域对象:

public class Customer {
    public string FirstName { get; set; }
    public string LastName { get;set; }
    public Address Address { get; set; }
}

我可能会将其展平为如下视图模型:

public class UpdateAddressModel {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressCity { get; set; }
    // etc.
}

当然,在某些情况下这样做没有意义,例如在线商店中的仪表板视图,其中有一个缺货产品列表和一个最近订单列表——这两件事无关,但您的观点需要:

public class DashboardModel {
    public List<Product> ProductsGoingOutOfStock { get; set; }
    public List<Order> NewOrders { get; set; }
}

那么如何将所有这些映射到模型对象?

我假设模型对象是指您的数据/域模型。这里的关键要点是,您用于呈现视图的视图模型不太可能与您发布到服务器的“模型”相同,如果它们是,您可能过度发布或者您有一些疯狂的输入-一切都会让你的眼睛流血的数据捕获屏幕。

我发现将发送到服务器的内容视为命令以及用于将视图呈现为视图模型的内容会有所帮助。

所以你的问题的答案 - 你如何将你的复杂视图模型映射你的数据模型?- 很简单,你没有。您应该向服务器发送执行特定任务的命令,例如更新地址。

在如何构建视图模型方面没有硬性规定,但通常会采用有意义的方法,如果它开始感觉太复杂,您可能会尝试用一个视图做太多事情。

我希望这有帮助。你会在我的博客上找到很多与这件事有关的帖子。

于 2013-02-26T10:30:39.757 回答
0

我意识到这是一个老问题,但我确实想解决 OP 提出的一个没有回答的问题。

Should all those [ViewModels] be packed into one file ?

Most of the examples I see put each ViewModel in a separate file, so the dominant convention seems to be one file per viewmodel, but I found in practice that this seems to be overkill. Instead I put all viewmodels for a particular controller in one file with multiple viewmodels in it. So for example if User is my Controller and I have several viewmodels associated with this controller such as UserAddViewModel, UserEditViewModel, UserDeleteViewModel I put all of the viewmodels for User in one file called UserViewModels.cs

于 2013-12-21T16:32:17.940 回答