【发布时间】: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