0

我来自使用 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。

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

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

4

1 回答 1

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; }
}

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

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

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

如果您曾经移动存储提供商,例如 Amazon S3 ( https://account.s3.amazonaws.com/filename.png ),您只需在一个地方更新 URL,您的视图完全不受影响

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

于 2013-01-14T01:34:09.340 回答