【问题标题】:Should I use a View Model? ASP.NET MVC [closed]我应该使用视图模型吗? ASP.NET MVC [关闭]
【发布时间】:2018-07-26 17:26:20
【问题描述】:

我正在我的 ASP.NET MVC 应用程序中填充一个视图。我有相当多的数据必须根据用户输入在页面之后加载,因此我正在进行 Ajax 调用来获取这些数据。我不想重新加载页面来获取数据。

如果我使用了错误的术语,请纠正我(过去一周我已经看到了一点),但是从 Ajax 加载的数据是幂等的,它将用于显示只要;用户不会更新数据作为输入。

我想知道的是,我在 Ajax 调用中获得的数据字段是否仍应在视图模型中定义?

考虑以下代码:

ProfileViewModel.cs

public class ProfileViewModel
{
    // populated on initial request
    string Name { get; set; }
    IEnumerable<Subscriber> Subscribers { get; set; }

    // the data in question - keep it here?
    IEnumerable<Post> SubscriberPosts { get; set; }
}    

ProfileController.cs

public class ProfileController
{
    public ActionResult Index()
    {
        return View( new ProfileViewModel()
        {
            Name = GetUserName(),
            Subscribers = GetAllSubscribers()
        });
    }

    public GetSubscriberPosts( string id )
    {
        // do stuff to get posts
    }
}

ProfileView.cshtml

@using MyNamespace.Models.ProfileViewModel
<div id="Profile">
    <h1>@Model.Name</h1>
    <ul>
        @{
             foreach(var subscriber in @Model.Subscribers)
             {
                 <li><a onclick="PreviewSubscriberPosts('@subscriber.UserID')">@subscriber.Name</a></li>
             }
         }
    </ul>
</div>
<div id="SubscriberPostsPreview">
    <!-- show some stuff here based on the selected subscriber -->
</div>
<script>
    $("#SubscriberPostsPreview").hide();

    function PreviewSubscriberPosts(userID) {
        // get the subsribers posts
        $.get("/Path/To/GetSubscriberPosts", { id = userID }, function (data) {
            // add data to the document
        });

        $("#SubscriberPostsPreview").show();
    }
</script>

我可以通过两种方式看到我的问题的答案,但我确信有人对这个问题有更好的答案。

(顺便说一句,据我了解,视图模型中定义的属性既可以表示您要显示的数据,也可以表示您希望从用户那里获取的数据)

回答 A
View Model 代表您要在视图中显示的数据,因此请在 View Model 中定义它。

答案 B
因为数据必须在使用 Ajax 的页面之后加载,并且用户不会更改数据,所以没有理由在 View Model 中定义数据。

我倾向于答案 B,​​但正在寻找其他人的意见。

【问题讨论】:

  • 仅仅因为它是通过 ajax 加载而不是在初始页面加载时并没有太大的区别。如果是我,我会为它定义一个视图模型。如果我有一组与原始视图模型有很大差异的传入数据(来自用户输入),那么我将在“请求模型”中声明它。做这种事情会使应用程序的维护变得更加容易。
  • 当您说“视图模型”时,您指的是用于原始页面加载的模型吗?一些代码示例将帮助我们了解您的上下文。
  • @nurdyguy 这是有道理的,所以您的“请求模型”本质上是一个视图模型,它在视图加载后的请求中填充?当该数据从 Ajax 调用返回到视图时,您必须使用客户端上的某些东西(显然)填充视图,因此您可以选择并使用 js/jquery 填充 html,而不是使用 razor 来显示数据?如果您想对此做出回答,请继续
  • 取决于您的应用程序,它是否敏感那么您必须使用视图模型,如果不是,您可以使用直接实体类加载数据以查看。由你决定 。但我会建议您始终使用 viewmodel。
  • @Jasen 刚刚添加了示例代码

标签: asp.net asp.net-mvc model-view-controller


【解决方案1】:

视图模型的目的是封装视图中使用的数据。无论是在页面加载视图中使用它还是作为对 ajax 调用的响应都无关紧要。如果所涉及的数据像字符串一样简单,或者可能只是一个整数列表/数组,那么我可能不会担心它。但如果它涉及的远不止这些,那么建议将其封装在 vm 中。

如果发送的请求与视图模型有很大差异,那么我建议为它创建一个新模型。这通常称为请求模型。术语“请求模型”更常用于描述 api 请求,但这里存在相同的基本思想。您有一个发往服务器的请求,该请求涉及一组有些复杂的数据。因此,您将数据封装在模型中,并让模型绑定发挥其魔力。这也将使服务器端代码更加简洁和易于维护。

请求模型和视图模型都是 DTO,即数据传输对象(另请参阅 POCO)。这些对象通常没有用户定义的构造函数(尽管它们在需要时可以),但它们非常适合创建更简洁的代码,并且更易于阅读和维护。

【讨论】:

    【解决方案2】:

    在这种情况下,您将拥有 2 个不同的 ViewModel。一个用于初始索引请求,一个用于 ajax 请求。 SubscriberPosts 只是 ajax 请求 ViewModel 上的一个属性。通常对于 Ajax 请求,我只是将我的 ViewModel 保留为匿名对象,而不是定义一个类。

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      相关资源
      最近更新 更多