我来自使用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的目的是什么?如何在单选按钮中显示我的列表? 这只是有点令人困惑。
答案 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,包括设置默认值,展平对象等。