Asp.net mvc 为什么在MVC4中有些人使用ViewModels?

Asp.net mvc 为什么在MVC4中有些人使用ViewModels?,asp.net-mvc,asp.net-mvc-4,radio-button,Asp.net Mvc,Asp.net Mvc 4,Radio Button,我来自使用MVVM的WPF编程,所以这是我第一次在ASP.NET中使用MVC 我想做的是展示这个模型: public class MultipleChoiceQuestion : Question { public string QuestionText public List<MultipleChoiceAnswer> PossibleAnswers { get; set; } } public class MultipleChoiceAnswer { p

我来自使用MVVM的WPF编程,所以这是我第一次在ASP.NET中使用MVC

我想做的是展示这个模型:

public class MultipleChoiceQuestion : Question
{
    public string QuestionText
    public List<MultipleChoiceAnswer> PossibleAnswers { get; set; }
}

public class MultipleChoiceAnswer
{
    public string Text { get; set; }
    public string UrlImage { get; set; }
    public bool IsCorrect { get; set; }
}
公共类多功能问题:问题
{
公共字符串文本
公共列表可能的应答{get;set;}
}
公共类多回音应答
{
公共字符串文本{get;set;}
公共字符串UrlImage{get;set;}
公共bool IsCorrect{get;set;}
}
如您所见,我有一个
列表
,这里是我试图用单选按钮显示的地方。我在这个网站上搜索了一些数据,我发现主要使用单选按钮中的ViewModels

在这里使用ViewModels的目的是什么?如何用单选按钮显示我的列表? 这只是有点令人困惑。

关于人们为什么使用ViewModels有很多问题。最直接的原因通常是视图所需的数据与业务模型中的数据不同。例如:

假设您的应用程序允许用户上传图像,然后将其保存到云存储中,如。存储在blob存储中的文件可以通过以下形式的URL访问:
https://account.blob.core.windows.net/filename.png

您的数据库模型可能类似于:

public class Image
{ 
    public int Id { get; set; }
    public string FileName { get; set; }
}
在这里,您正在保存图像的文件名。保存完整的URL会浪费空间,而且会使数据移动到其他位置非常困难

但是,在显示图像时,视图需要完整的URL。这就是ViewModel变得有用的地方。(请参阅下面关于如何避免在ViewModels中硬编码URL的说明)

通过将其传递给视图,它现在拥有正确显示此图像所需的一切:

<h3>@Model.FileName</h3>
<img src="@Model.Url" alt="@Model.FileName"/>
@Model.FileName
如果您移动了存储提供商,比如AmazonS3(),您只需要在一个地方更新URL,您的视图就完全不受影响

作为补充说明,您可能希望进一步简化事情,并避免在ViewModels中硬编码URL。AutoMapper允许您定义映射模型->视图模型的规则,包括设置默认值、展平对象等。

关于人们为什么使用视图模型有很多问题。最直接的原因通常是视图所需的数据与业务模型中的数据不同。例如:

假设您的应用程序允许用户上传图像,然后将其保存到云存储中,如。存储在blob存储中的文件可以通过以下形式的URL访问:
https://account.blob.core.windows.net/filename.png

您的数据库模型可能类似于:

public class Image
{ 
    public int Id { get; set; }
    public string FileName { get; set; }
}
在这里,您正在保存图像的文件名。保存完整的URL会浪费空间,而且会使数据移动到其他位置非常困难

但是,在显示图像时,视图需要完整的URL。这就是ViewModel变得有用的地方。(请参阅下面关于如何避免在ViewModels中硬编码URL的说明)

通过将其传递给视图,它现在拥有正确显示此图像所需的一切:

<h3>@Model.FileName</h3>
<img src="@Model.Url" alt="@Model.FileName"/>
@Model.FileName
如果您移动了存储提供商,比如AmazonS3(),您只需要在一个地方更新URL,您的视图就完全不受影响


作为补充说明,您可能希望进一步简化事情,并避免在ViewModels中硬编码URL。AutoMapper允许您定义映射模型->视图模型的规则,包括设置默认值、展平对象等。

关于人们为什么使用视图模型有很多答案()。最直接的原因通常是视图所需的数据与业务模型中的数据不同。ViewModels是强类型的,允许您聚合来自不同来源的数据。您可以将视图模型视为视图所需的数据对象/实体/模型的精简聚合。关于人们为什么使用ViewModels(),有很多答案。最直接的原因通常是视图所需的数据与业务模型中的数据不同。ViewModels是强类型的,允许您聚合来自不同来源的数据。您可以将视图模型视为视图所需的数据对象/实体/模型的精简聚合。谢谢,我明白了。有一个疑问,你能给我一个在我的场景中使用viewModel的例子吗?作为指导,如果你不介意的话,在上面的getter中实现逻辑是很有诱惑力的。对这种做法要非常保守。谢谢你,我明白了。有一个疑问,你能给我一个在我的场景中使用viewModel的例子吗?作为指导,如果你不介意的话,在上面的getter中实现逻辑是很有诱惑力的。对这种做法要非常保守。