将不同的模型类型从控制器传递到视图是一种好习惯吗?

时间:2016-05-03 23:54:45

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

我有销售控制器和产品控制器。销售控制器具有“创建”操作,该操作返回一个视图,该视图显示在数据库中注册的所有产品。用户必须在最终确定之前指定商品的销售数量,折扣和客户。

我想知道Sales控制器查询数据库并传递不同的模型类型(在这种情况下是产品列表)是否是一个好习惯。

Sales控制器中的操作如下所示:

[HttpGet]
public ActionResult Create()
{
    ProductRepository productRepository = new ProductRepository();
    List<Product> products = productRepository.ListProducts();
    return View(products);
}

我的问题是:给定控制器中的操作是否必须严格传递其名称的相同模型类型?

我还想使用输入字段搜索客户端并使用Ajax检索数据(如果可能的话),但我不清楚是否应该请求SalesController或ClientsController。

对不起,如果这是一个愚蠢的问题,我还是MVC和ASP.NET的新手。

3 个答案:

答案 0 :(得分:2)

  

我的问题是:给定控制器中的操作是否必须严格传递其名称的相同模型类型?

不,他们为什么会这样?

规则是'#34;不要让我感到惊讶&#34;。如果行为有意义,我就不在乎你的回归。如果行为是荒谬的,则返回&#34;更正&#34;班级不会解决它。

答案 1 :(得分:1)

  

我的问题是:给定控制器中的动作是否必须严格执行   传递其名称的相同模型类型?

要添加到Jonathan的答案中,有一个警告只能使用数据库模型,而且缺乏灵活性。我总是使用视图模型,即使它是一个简单的页面,因为随着项目的发展,需求也在不断变化。但几乎所有代码的最佳实践是编写对最有意义的内容。

答案 2 :(得分:0)

您可以将任何类型的模型传递给您的视图。例如,它可以是域模型,域模型列表,视图模型,视图模型列表等。您的可能性是无穷无尽的。

当我将数据传递给视图时,我通常会使用视图模型。视图模型将包含应该在屏幕上显示的数据。

如果您想在视图中仅显示与产品相关的数据列表,那么我认为可以执行以下操作:

public ActionResult Create()
{
     // productRepository is injected
     List<Product> products = productRepository.GetAll();

     return View(products);
}

如果除了产品列表之外还希望在视图上显示其他数据,那么我通常会使用视图模型:

public ProductViewModel()
{
     public List<Product> Products { get; set; }

     public string Department { get; set; }
}

然后您的视图可能会更改为:

public ActionResult Create()
{
     ProductViewModel productViewModel = new ProductViewModel();
     productViewModel.Products = productRepository.GetAll();
     productViewModel.Department = "Test Department Name";

     return View(productViewModel);
}

我希望这会有所帮助。