简述:
ViewModel是ASP.NET Core MVC应用中的隐式声明的层,用来维护Model和View之间的数据传递,是View的数据容器。Model向视图传递数据最可靠的方法是在视图中指定模型类型。此模型通常称为 viewmodel。将 viewmodel 类型的实例传递给视图。使用 viewmodel 将数据传递给视图可让视图充分利用强类型检查。强类型化(或强类型)意味着每个变量和常量都有明确定义的类型(例如 string
、int
或 DateTime
)。在编译时检查视图中使用的类型是否有效。
扩展:
工作原理流:
1、用户提出需求,Controller处理用户的交互逻辑,执行简单的判断。
2、Controller获取一个或者多个Model数据
3、Controller决策使用哪个View最符合用户请求
4、Controller将根据Model数据和View需求创建并初始化ViewModel对象
5、Controller将ViewModel数据以ViewData或者ViewBag或者强类型的View等对象传递到View中,并返回View。
ViewModel分别与View,Model关联方式:
View将变成ViewModel的强类型的View,Model却和ViewModel是互相独立的,Controller将根据Model对象创建并初始化ViewModel对象。
使用示例:
使用 @model
指令指定模型。使用带有 @Model
的模型:
@model WebApplication1.ViewModels.Address <h2>Contact</h2><address> @Model.Street<br> @Model.City, @Model.State @Model.PostalCode<br> <abbr title="Phone">P:</abbr> 425.555.0100</address>
为了将模型提供给视图,控制器将其作为参数进行传递:
public IActionResult Contact(){ ViewData["Message"] = "Your contact page."; var viewModel = new Address() { Name = "Microsoft", Street = "One Microsoft Way", City = "Redmond", State = "WA", PostalCode = "98052-6399" }; return View(viewModel);}
没有针对可以提供给视图的模型类型的限制。建议使用普通旧 CLR 对象 (POCO) viewmodel,它几乎没有已定义的行为(方法)。通常,viewmodel 类要么存储在“Models”文件夹中,要么存储在应用根目录处的单独“ViewModels”文件夹中。上例中使用的 Address viewmodel 是存储在 Address.cs 文件中的 POCO viewmodel:
namespace WebApplication1.ViewModels{ public class Address { public string Name { get; set; } public string Street { get; set; } public string City { get; set; } public string State { get; set; } public string PostalCode { get; set; } }}
可随意对 viewmodel 类型和业务模型类型使用相同的类。但是,使用单独的模型可使视图独立于应用的业务逻辑和数据访问部分。模型为用户发送给应用的数据使用模型绑定和验证时,模型和 viewmodel 的分离也会提供安全优势。
引用1:https://docs.microsoft.com/zh-cn
引用2:https://blog.csdn.net/jasonhds/article/details/51141664