关于MVC和实体框架的良好实践的问题

时间:2015-09-01 13:11:00

标签: c# asp.net-mvc entity-framework

我正在尝试使用VS和Entity Framework构建一个简单的MVC应用程序,我几乎没有问题。

  1. 我想为我的模型添加一些默认值,我可以这样做 包括构造函数的默认值,如下所示:

    public Worker()
    {
        WorkerActive = true;
    }
    

    但是默认控制器代码是这样的,并且它没有返回任何内容

    public ActionResult Create()
    {
        return View();
    }
    

    如果我改变它,它可以工作,但我不确定我是否做错了什么:

    public ActionResult Create()
    {
        return View(new Worker());
    }
    

    这里有什么问题吗?

  2. 我有一个包含所有工人的组合框,我想展示一些 基于选择的记录。例如,我想要显示所有 记录 WorkerId = ComboboxValue 的记录。我可以轻松地做到这一点 使用这个:

    workers = m.Workers.Where(w => w.BranchId == curUser.BranchId).ToList<Worker>();
    

    但它在一个视野中。正在使用 声明在哪里看到一个不好的做法?我可以添加一个新方法 控制器如 getUsersByBranch(BranchId)并使用它。 什么是正确的方法?

  3. 由于

2 个答案:

答案 0 :(得分:3)

1)我认为你的模型应尽可能愚蠢,只需要属性和元数据。但是,您的控制器当然可以在其中使用逻辑来操纵模型。这就是它的用途 - 将模型返回到视图中,但是你觉得合适:

 public ActionResult Create()
 {
     var model = new Worker { WorkerActive = true };
     return View(model);
 }

另外,您不必担心在不同的控制器中需要不同的默认值。

2)视图“应该”非常愚蠢。但与所有最佳实践一样,它实际上归结为重构的开销和潜在的收益。不,该代码可能不应该在您的视图中。理想情况下,如果视图需要它,那么它就是你的模型的某种属性,你的控制器已经设置好了。

简单视图的“最佳实践”的逻辑是,如果你继续这样做,它会很快变得过于复杂,导致意大利面条代码。但就像我说的那样,你应该尝试一下,看看有时喜欢它们,而不是盲目地与最佳实践相提并论。

'你的模特的财产'我的意思是:

public class CreateModel
{
     public List<User> UsersInBranch { get; set; }
}
然后你的控制器可以填写它,如上所述。保持您的视图更清洁,并让控制器执行它的预期功能。使用MVC和Razor,视图中的逻辑在您的视图中(在我看来)中并非真正,因为它仍在运行服务器端。感觉就像把服务器和客户端操作混合在一起。

答案 1 :(得分:1)

public ActionResult Create()
{
    return View(new Worker());
}

这里没有问题,但工人是一个实体?也许你应该将基础设施(ef mapping)代码与presentation(mvc)分开。

workers = m.Workers.Where(w => w.BranchId == curUser.BranchId).ToList<Worker>();

请勿在您的视图中执行此操作。将此代码移动到存储库会更好。看看Martin Fowler关于这种模式的好文章:

http://martinfowler.com/eaaCatalog/repository.html