什么是从控制器返回数据列表的最佳方法

时间:2017-05-17 12:47:12

标签: c# asp.net-mvc

我有List<MyModel>我从控制器返回view

我应该创建一个新类来保存这个List并返回新类的对象,否则我可以返回List本身..

哪一个是更好的编程习惯?

8 个答案:

答案 0 :(得分:2)

在局部视图中,我经常使用IEnumerable,其中有重复逻辑

@model IEnumerable<Result>

@foreach (Result res in Model)
{
    <div data-id="@res.ID">
        <p>
        <!-- Code goes here -->
        </p>
    </div>
}

答案 1 :(得分:2)

View-model只是MVC表示层中的概念术语。从技术上讲,它只是一个具体的课程。

这里真正的问题是使用View-model / class还是直接传递List

现在回到关键点 - 仅包装&#39;除非你很少有其他成员被包装并传递给视图,否则另一个类中的列表将不会产生任何结果。如果您的视图需要的内容超过List,请创建一个类(在MVC中称之为View-model)以包装所有内容并将其传递给view。

答案 2 :(得分:2)

除非您拥有该属性,否则没有理由创建除个人偏好之外的视图模型,除非您将来有可能添加更多属性。

但是,最好尽可能利用接口来保持代码解耦。那说你应该把它切换到IEnumerable而不是list。

答案 3 :(得分:2)

这取决于您的具体要求,请考虑以下两种情况。

  1. 将MVC webapi与任何js框架(如angular / jquery或返回部分视图)一起使用。 您只想将列表绑定到网格,并使用来自同一控制器操作的新数据更新该网格。在这种情况下,最好返回列表而不是视图模型,这将确保只将所需数据发送回视图。
  2. ``

    [HttpPost]
    public List<string> Index(string txtJsonIn)
    {
     return new List<string>(); 
    }
    
    1. 在没有任何js / ajax调用的情况下使用MVC 在这种情况下,视图将每次都加载来自ViewModel的值,因此如果您只是将List作为操作的返回值,将来很难添加新属性。

      class MyViewModel
      {
          List<string> MyList { get; set; } //Your list that you need right now
          string PropertyThatCanBeAddedInFuture { get; set; }
      }
      
      [HttpPost]
      public MyViewModel Index(string txtJsonIn)
      {
      
          return new MyViewModel(); 
      }
      
    2. 您可以按如下方式编写视图

          @foreach (string str in Model.MyList)
          {
            <tr>@str</tr>
          }
      
      • 同样使用viewModels始终是松散耦合代码的好方法,不要直接使用数据库中的任何模型,而是使用Automapper将viewmodel映射到数据库中的模型。

答案 4 :(得分:1)

我总是创建一个viewmodel,将数据传递给我的视图,在控制器中填充它,然后将其传递给您的视图。这是一种在MVC中工作的简洁方法。

提示:在Models文件夹中创建一个新文件夹ViewModels。 与实体相同,永远不会直接使用您的实体,使用仅提供视图中所需内容的视图模型。另外看一下Data Annotations,这些在使用viewmodel进行表单验证等时会派上用场......

答案 5 :(得分:1)

你可以创建一个像Jelman所说的视图模型,并在其中通过在模型文件夹中创建另一个包含模型列表的类文件来声明这样的模型列表

spark-submited

或者如果没有其他字段需要添加到模型中,您可以简单地更改视图顶部的声明以获得您的模型列表

cluster

答案 6 :(得分:1)

虽然您可以将该模型返回到视图,但很可能并非所有数据都将在视图中使用。因此,我们创建仅包含与视图相关的数据的视图模型类,并使用映射器(请查看AutoMapper)在两个对象之间进行映射。

虽然这增加了另一个要管理的类,但它使域模型保持良好和干净,并且没有任何&#34;视图特定的&#34;属性(例如下拉列表中使用的列表等)

您最终返回的内容将最终成为您在视图中所需的任何内容,因为您可能希望在该集合中包含一些其他数据(或元数据),在这种情况下将使用对象包装器。

希望这有帮助。

答案 7 :(得分:1)

创建包含列表的新模型更为正确。如果明天您需要添加新属性,则可以轻松地将其添加到此模型,而无需在视图中更改viewmodel。

比较

你有一个带有对象列表的模型:

class MyModel
{
    public List<int> Comments {get;set;}
}

您的观点如下:

@model MyModel
foreach(var comment in Model.Comments)
...

当您需要添加新属性时,您可以轻松地执行此操作:

class MyModel
{
    public string Title {get;set;}
    public List<int> Comments {get;set;}
}

您的观点将如下所示

@model MyModel
...
Model.Title
...
foreach(var comment in Model.Comments)
...

因此,您无需在控制器和视图中更改模型类型,只需向创建的模型添加新属性