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

C# 在ASP.NET MVC中创建具有多个下拉列表和文本字段的大型表单,c#,asp.net-mvc,data-binding,extension-methods,viewmodel,C#,Asp.net Mvc,Data Binding,Extension Methods,Viewmodel,在ASP.NET MVC的后续旅程中,我现在需要为实体呈现编辑/创建表单 我的实体由enum和一些其他模型组成,它们通过LINQtoSQL在存储库中创建 我现在正在努力寻找一种体面的方式来呈现编辑/创建表单,其中包含一些下拉列表和一些文本字段。我意识到这可能不是最方便用户的方法,但这正是我现在要做的:) 我有一个存储库层和一个业务层。控制器与服务层接口 像这样简单地创建一个viewmodel是最好的吗 public class EventFormViewModel { IEventSer

在ASP.NET MVC的后续旅程中,我现在需要为实体呈现编辑/创建表单

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

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

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

像这样简单地创建一个viewmodel是最好的吗

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
{
IEventService(事件服务);
公共IEvent事件{get;private set;}
公共IEnumerable活动{get;private set;}
公共IEnumerable状态{get;private set;}
//其他表格/下拉列表位于此处
//建造师
公共事件表单视图模型(IEventService事件服务,IEvent ev)
{
_eventService=eventService;
事件=ev;
//初始化集合
Campaigns=eventService.getCampaigns().ToSelectList();//可能是extn方法吗?
Statuses=eventService.getStatus().ToSelectList();/extn是否针对每种表类型?
}
因此,这将为我提供一个新的EventFormViewModel,我将绑定到一个视图。但这是最好的方法吗?基本上,我将从数据库中提取几个不同表的所有数据,并将它们转换为IEnumerable。这似乎效率不太高,但我想我可以缓存下拉列表的内容

另外,如果我所拥有的只是为下拉列表获取数据的方法,那么我是否应该跳过服务层直接转到存储库

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


如果这太笼统了,请原谅,我只是想避免走死胡同,或者走一条坑坑洼洼的路。

如果你想“跳过”,我会说一个比你还没有真正准备好使用MVC的层。这些层的全部意义,即使它们很薄,都是为了促进单元测试,并尝试强制分离关注点


至于泛型方法,是否有什么原因可以只使用OOB对象,然后扩展它们(使用扩展方法)当它们不能满足您的需要时?

我不会为我的视图模型对象提供IEventService。我更愿意将视图模型对象视为一个哑数据传输对象。我会让控制器负责向IEventService请求数据并将其传递给视图模型

我基本上是在提取所有数据 从数据库返回几个小时 不同的表及其转换 数不清

我不明白这为什么会低效?显然,不应该从表中提取所有数据。像往常一样在数据库中执行筛选和连接。将结果放入视图模型中

还有,如果我只有这些方法的话 获取下拉列表的数据,我应该 跳过服务层,直接转到 存储库

如果您的应用程序非常简单,那么服务层可能是一个不必要的抽象/间接层。但是如果您的应用程序有点复杂(从您上面发布的内容来看,我猜是这样的)如果你使用一个快捷方式,直接进入一个存储库,并将它与你将在维护性和可测试性方面的优势进行比较,如果你使用一个服务层。
你能做的最糟糕的事情是,只有当你觉得有必要时才去服务层,当服务层不提供任何额外逻辑时,直接去存储库。无论你做什么,都要保持一致(这几乎总是意味着:即使你的应用程序很简单,也要通过服务层。它不会保持简单)。

我最喜欢的SO-匿名否决票。也许有一天会需要发表评论。+1我喜欢扩展数据对象的想法-这会让你尝试一下:)。我认为“层”虽然我明白你的观点,但这一部分并不是MVC独有的。我把服务层放在那里是有原因的——不管这个电话多么简单,理论上我都不应该跳过它。我不认为你用咄咄逼人的语气帮了自己什么忙,但我会给你+1,因为我认为你有道理。+1很好,Rune。如果有什么不同的话,那就是“你没有疯”答案,我有时需要:)另外,让ViewModel构造函数接受您希望它保存的所有数据是否更好?至于构造函数问题,我真的不太关心。有时候视图模型对象可以有很多不同的属性。在这种情况下,我更喜欢使用初始化块(或任何调用它们的东西),您知道:newmyObject(){Property1=value1,…};