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

时间:2013-01-14 01:13:30

标签: 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
{
    public string Text { get; set; }
    public string UrlImage { get; set; }
    public bool IsCorrect { get; set; }
}

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

Has anyone implement RadioButtonListFor<T> for ASP.NET MVC?

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

1 个答案:

答案 0 :(得分:5)

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

假设您的应用程序允许用户上传图像,然后将其保存到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; }
}

在这里,您要保存图像的文件名。保存完整的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; }
    }
}

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

<h3>@Model.FileName</h3>
<img src="@Model.Url" alt="@Model.FileName"/>

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

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