为什么在MVC4中有些人使用ViewModels?

Dar*_*Zon 0 asp.net-mvc radio-button asp.net-mvc-4

我来自使用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; }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我有一个List<T>,这里是我试图在RadioButtons中显示的地方.我在这个网站上搜索一些数据,我发现主要使用了radioButtons中的ViewModels.

有没有人为ASP.NET MVC实现RadioButtonListFor <T>?

在这里使用ViewModels的目的是什么?如何在单选按钮中显示我的列表?这只是一点点混乱.

mfa*_*nto 5

关于人们使用ViewModel的原因有很多答案.最直接的原因通常是您的视图所需的数据与业务模型中的数据不同.例如:

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

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

public class Image
{ 
    public int Id { get; set; }
    public string FileName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在这里,您要保存图像的文件名.保存完整的URL会浪费空间,而且会使数据移动到其他位置非常困难.

但是,在显示图像时,您的视图需要完整的URL.这就是ViewModel变得有用的地方.(请参阅下面的说明,了解如何避免在ViewModel中对URL进行硬编码).

public class ImageViewModel
{
    public int Id { get; set; }
    public string FileName { get; set; }

    public string Url 
    {
        get { return "https://account.blob.core.windows.net/" + FileName; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<h3>@Model.FileName</h3>
<img src="@Model.Url" alt="@Model.FileName"/>
Run Code Online (Sandbox Code Playgroud)

如果你移动存储提供商,比如说亚马逊S3(https://account.s3.amazonaws.com/filename.png),你只需要在一个地方更新网址,你的视图完全不受影响

作为旁注,您可能希望将AutoMapper视为进一步简化操作的方法,并避免在ViewModel中对URL进行硬编码.AutoMapper允许您定义用于映射模型 - > ViewModel的规则,包括设置默认值,展平对象等.