在ASP.NET MVC中创建具有多个下拉列表和文本字段的大型表单

时间:2010-03-01 14:11:30

标签: c# asp.net-mvc data-binding extension-methods viewmodel

在我继续浏览ASP.NET MVC的过程中,我现在处于需要为实体呈现编辑/创建表单的位置。

我的实体由枚举和一些其他模型组成,通过LINQtoSQL在存储库中创建。

我现在正在努力寻找一种体面的方式来渲染编辑/创建表单,其中包含一些下拉列表和一些文本字段。我意识到这可能不是最方便用户的方法,但这就是我现在要做的事情:)。

我有一个存储库层和一个业务层。控制器与服务层连接。

最好是简单地创建一个这样的视图模型吗?

public class EventFormViewModel
{
    IEventService _eventService;

    public IEvent Event { get; private set; }

    public IEnumerable<EventCampaign> Campaigns { get; private set; }
    public IEnumerable<SelectListItem> Statuses { get; private set; }
    // Other tables/dropdowns go here

    // Constructor
    public EventFormViewModel(IEventService eventService, IEvent ev)
    {
        _eventService = eventService;
        Event = ev;

        // Initialize Collections
        Campaigns = eventService.getCampaigns().ToSelectList(); //extn method maybe?
        Statuses = eventService.getStatus().ToSelectList();  /extn for each table type?
    }

所以这将给我一个新的EventFormViewModel,我将绑定到一个视图。但这是最好的方法吗?我基本上是从数据库中取回所有数据,用于几个不同的表并将它们转换为IEnumerable。这似乎没有太高效,但我想我可以缓存下拉列表的内容。

另外,如果我只有获取下拉列表数据的方法,那么我应该跳过服务层并直接进入存储库吗?

我的问题的最后一部分:对于ToSelectList()扩展方法,是否可以为每个表编写一个方法并使用它,即使某些表具有不同的列(“Id”和“Name”与“ Id“和”CampaignName“)。

请原谅我,如果这种情况过于笼统,我只是想避免走上一条死路 - 或者说会有很多坑洼的道路。

2 个答案:

答案 0 :(得分:1)

我不会为我的视图模型对象提供IEventService。我更喜欢将视图模型对象视为哑数据传输对象。我会让控制器负责向IEventService询问数据并将其传递给视图模型。

  

我基本上是在拉所有数据   从数据库中返回几个   不同的表并转换它们   到IEnumerable

我不明白为什么这会效率低下?你显然不应该从表中提取所有数据。像往常一样在数据库中执行需要进行的过滤和连接。将结果放在视图模型中。

  

另外,如果我所拥有的只是方法   我应该只获取下拉列表的数据   跳过服务层并向右转   存储库?

如果您的应用程序非常简单,那么服务层可能是不必要的抽象/间接层。但是如果你的应用程序有点复杂(根据你上面发布的内容,我猜这就是这种情况),通过快捷方式直接进入存储库并将其与你将赢得的内容进行比较来考虑你的意愿如果您使用服务层,则具有可维护性和可测试性。

您可以做的最糟糕的事情是,只有在您觉得需要它时才能通过服务层,并在服务层不提供任何额外逻辑时直接进入存储库。无论你做什么,都要保持一致(这几乎总是意味着:通过服务层,即使你的应用程序很简单。它也不会保持简单。)

答案 1 :(得分:0)

我想说如果你想要“跳过”一层而不是你还没准备好使用MVC。层的整个点,即使它们很薄,也是为了促进单元测试,并试图强制分离关注点。

对于泛型方法,是否有一些理由可以使用OOB对象,然后在它们无法满足您的需求时扩展它们(使用扩展方法)?