2016-11-13 45 views
0

有时我把我的一些C#代码放在我的视图(.cshtml)中,而不是我所有的代码。比如我有一个名为LawCategory表,我这样做:在cshtml视图中使用实体框架的缺点

@{ 
    var db = new Contracts.Models.DataContext(); 
    var LawCat = db.LawCategory.ToList();  
} 

,然后用它是这样的:

<div class="col-md-6"> 
      <label>category:</label> 
      <select name="Type" id="Type" class="form-control"> 
       <option value="0">All</option> 
       @foreach (var i in LawCat) 
       { 
        <option value="@i.ID" @(Request.QueryString["id"] == i.ID.ToString() ? "selected" : "")>@i.Name</option> 
       } 
      </select> 
     </div> 

我想知道什么是在视图中使用的DataContext的缺点和连接到数据库,而不是从控制器发送视图模型?

确实这样做,可能会导致设置多重连接到数据库? (实体框架)

+1

它的设计很差。假设你可以用1000行代码编写一个完整的应用程序,但是你不应该因为它的设计不佳。该视图应该只涉及表示逻辑,与数据存储的交互应该在控制器中进行,或者在调用堆栈之后进行。 – Igor

+0

基于意见。不适合堆栈溢出。 –

回答

4

您可以直接在View中使用DBContext(EntityFramework)代码,因为它是允许的并且完美地执行。

现在问题出现在设计和MVC模式本身。

  1. 在MVC模式中,我们主要用于分离关注点。除了管理观点外,这里的观点还有一个以上的问题。它直接调用EntityFramework,所以它打破了这一点。

  2. 它使代码不易测试。在这里我们也想看看每个视图,因为视图可能包含一些代码,并且在Controller中没有指定,所以通过仅查看控制器,我们不能识别依赖关系。

+0

那么不用担心多重连接数据库? –

+0

这取决于。让我们假设你想要使用EF获取多个表记录,并且你在View中调用Entity框架并使用它们来获取多个数据,然后不会发布,但是设计和模式的问题将在那里。 – dotnetstep

+0

因此,让我们假设我在我的动作中也使用了EF连接,在这种情况下是否有问题?我的行动中的一个连接返回我的观点和另一个连接在我看来 –

0

首先,你打破了MVC模式,你需要的模型,业务logci(控制器)和渲染视图和原因是多方面的(在这里阅读更多:https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)分开,如果

其次,你的正在构建一个您需要考虑的规则可以遵循的Web应用程序(如果您想以正确的方式进行操作)。在这里你需要构建和管理你的业务层(主要是你的数据模型),然后你可以选择在你的表示层中使用的任何模式(对于你的案例MVC)。在这里了解更多关于三层架构的信息:http://www.c-sharpcorner.com/uploadfile/4d9083/create-and-implement-3-tier-architecture-in-asp-net/

第三,使用C#和.NET玩非常酷且有助于学习,但如果您想构建专业的Web应用程序,则需要学习大量关于软件设计模式。这里有一本好书“可重用的面向对象软件的元素”