专有的Web应用程序到MVC3 / Entity

为了重写(从头开始),我已经在几个月的时间里发布了一些关于ASP.NET应用程序和数据库抽象层结构的问题。 我最近偶然发现了MVC3 / Entity-Code-First,花了一些时间与之相恋,已经爱上了它的工作方式,如何抽象出事物,并且我正在寻找任何借口来使用它!

传统应用程序是一个C ++ / CLI窗口服务,它生成它自己的HTML(非常古老的HTML,CSS仅用于颜色和表格),并且界面与业务逻辑紧密耦合。 基本上,任何事情都会有所改善。

然而,也许这是因为我还没有花费足够的时间与MVC,我有一些唠叨的疑惑,并想知道你MVC-Pros的一些人是否可以在我的方向上传播他们的经验。

  • 传统应用程序使用自定义控件(它们自己的形式)将组合框与数据绑定,并根据另一个组合框中的选择动态地重新填充相关的组合框。 在ASP.NET中,这个问题很容易回答,因为只是在页面上抛出一个asp:DataList控件,将它绑定到数据源,并且瞧。 有点简单的代码可以让你过滤所选值的其他组合框。 在ASP.NET中,使用这种方式实现另一个数据列表甚至可以实现自动化的依赖数据(这将很好地模拟传统应用程序的行为),这也很容易。 我似乎无法在MVC中找到自定义控件的概念,但我认为这种类型的内容是由jQuery调用来获取数据并将其放入组合框中的。 但是,每个页面上的每个组合框都有吗? 这是部分视图的情况下,通过适当的参数,或者这只是愚蠢的?

  • 我想这与MVC相关的实体框架更多,但我在网上找到的大多数示例和教程都执行LINQ查询以返回一组对象,以便从MvcMovie示例中显示出来,例如:

    public ActionResult Index()
    {
        var movies = from m in db.Movies
                     where m.ReleaseDate > new DateTime(1984, 6, 1)
                     select m;
    
        return View(movies.ToList());
    }
    

    然后在视图中使用@foreach循环渲染。 这非常棒。 遗留应用程序有一个单一的浏览页面,供系统的所有其他区域使用(有50多个)。 它通过检查为登录的用户定义的列顺序来实现这一点,扁平化任何外键(以便显示外表上的字段而非非用户友好的主键值),并且还允许用户应用自定义过滤器到任何列。 它也适用于行数超过100k的表格。 如何使用Entity框架和视图去编写类似的东西? 在ASP.NET中,我可能会通过动态生成某种网格视图来解决这个问题,并让它自动生成列并应用过滤器。 这似乎可能会让我在MVC中做更多的工作。 我错过了什么?

  • 遗留应用程序有多个操作可以在大量数据集上运行。 现在因为它是一项服务,它可以启动这些线程而不用担心被关闭。 我在这里提出的一个问题是关于静态管理人员和引入AppPool回收的问题,但我已经决定有一个辅助服务是一个不错的选择。 也就是说,遗留应用程序将更新语句应用于大型记录组而不是单行记录。 这是否可以用Entity-Framework而不针对旁路正常模型的数据库编写自定义SQL? 我希望我不必这样做(不是我会这样,例如)

    var records = from rec in myTable
                  where someField = someValue
                  select rec;
    foreach(rec in records)
        rec.applyCalculation();
    db.SaveDbChanges();
    

    我怀疑这可能需要很长时间,而传统应用只会这样做:

    UPDATE myTable
    SET field1 = calc
    WHERE someField = someValue
    

    所以我不清楚我们如何以这种方式使用我们的模型。

  • 传统应用程序在布局中有一些数据面板,可以随身携带任何页面。 在这里看Stackoverflow,我发现了这个问题,这意味着每个视图都需要将这些信息传递给布局? 这是如此,还是有更好的方法? 理想情况下,我希望我的布局能够访问特定的模型/存储库并在侧面板中显示数据。 添加到每个视图页面可能是相当重复的,容易出错。 更不用说如果我需要修改某些东西的话,那就需要花费时间。 部分视图会在这里做,但我不确定如何在布局页面上将模型传递给它。

  • 最后,在安装Ef-Code-First之后,我感到很失望,发现SourceName还没有成功。 这对于映射遗留的表/列是非常好的,我不完全确定它为什么在这一点上被遗漏(至少,我的intellisense说它不在那里!)有没有人知道这可能是什么时候发生的? 我可以在一段时间内没有它,但最终它会非常有用。

  • 对于冗长的问题抱歉。 在ASP.NET和MVC3中进行调查性工作之后,我真的很想去用MVC3!


    如果我设法正确提取问题,那么这将是我的答复:

  • 你在思考主 - 细节下拉(或其他控制,对于这个问题)方面是对的。 jQuery的AJAX / JSON调用(主要是GETs)将是你需要的。 如果你的页面只有一个下拉菜单,那么当然你不需要这种交互 - 你可以在你的控制器动作中创建一个模型(你创建一个SelectList对象)。

  • 在这里,你很可能最终会使用某种网格系统,如jqGrid或Flexigrid。 他们完成大部分有关过滤/搜索/查询的内容。 您仍然必须提供将提供数据的JSON控制器操作。

  • 是的,你可以通过EF执行SQL。 有ExecuteStoreQuery()ExecuteStoreCommand() 。 以下是http://msdn.microsoft.com/en-us/library/ee358769.aspx上的更多内容

  • 您可以从视图中调用RenderAction() ,并根据需要(每当您调用它时)准备数据并渲染部分(或普通)视图并将数据(模型)提供给它。 RenderPartial()在这方面稍微笨拙 - 它要求您在调用RenderPartial()的视图中已经可以使用该模型。 RenderPartial()永远不会返回到控制器操作 - 它只是使用您在视图中调用时提供的模型呈现模板中定义的HTML。

  • 不幸的是,我不知道这个答案。

  • HTH


    你可能不喜欢它,但是重构c ++应用程序可能会更有意义。 特别是对于商业。 生成html没有任何问题。 比一组模板更容易重构现代html / css。

    链接地址: http://www.djcxy.com/p/50243.html

    上一篇: proprietary Web Application to MVC3/Entity

    下一篇: getting out of db.find() resultset