一直想整理一下这个内容,今天终于有空(kun nan)了。
传值方式
强类型传值:ViewModel
弱类型传值:ViewData和ViewBag
强类型参数传值-ViewModel
后端和页面使用同一个模型进行强类型传值,可以很好的避免拼写错误,IDE也能更好的进行动态感知:
// controller
public IActionResult Index()
{
var User = new User
{
Username="kingofyongchun",
RealName="叶问",
};
ViewData["title"] = "传值测试";
return View(User);
}
@{
Layout = null;
}
@model TestProject.ViewModels.User
@ViewData["title"]viewmodel
username: @Model.Username
realname: @Model.RealName
User类可以是任何类,不过官方建议将其和数据库实体类分开;推荐的做法是在你的mvc工程中新建ViewModel命名空间;将视图模型全部写在下面。
User类最好是POCO类(Plain Old CLR Object), 只含属性,不含方法
值以参数的方式传递给View方法
View中首先用@model定义类型
使用@Model.xxx拿到实际值。
弱类型数值传递
弱类型数据的适用情形举例:
image.png
ViewData 属性是弱类型对象的字典。
ViewBag 属性是 ViewData 的包装器,为基础 ViewData 集合提供动态属性。
对于 ViewData 和 ViewBag,键查找都不区分大小写。
一些程序员压根不使用弱类型传递,他们认为这非常容易出错,见仁见智吧。
ViewData
ViewData本质是字典,其Key为自定义的string,如上面例子的title
传递字符串时,客户端取出时不需要转换,否则都需要类型转换。
public IActionResult SomeAction()
{
ViewData["Greeting"] = "Hello";
ViewData["Address"] = new Address()
{
Name = "Steve",
Street = "123 Main St",
City = "Hudson",
State = "OH",
PostalCode = "44236"
};
return View();
}
@{
// 非字符参数需要casting转换
var address = ViewData["Address"] as Address;
}
// string类型无需转换
@ViewData["Greeting"] World!
@address.Name
@address.Street
@address.City, @address.State @address.PostalCode
控制器中也可以使用[ViewData]特性声明
public class TestController: Controller
{
[ViewData]
public string Message { get; set; }= "what a killing hot day!";
// GET: //
public IActionResult Index()
{
var User = new User
{
Username="kingofyongchun",
RealName="叶问",
};
ViewData["title"] = "传值测试";
ViewBag.Guest = "泰森";
return View(User);
}
}
@{
Layout = null;
}
@model BioVR.Entities.Models.User
@ViewData["title"]ViewModel
username: @Model.Username
realname: @Model.RealName
ViewData
@ViewData["Message"]
ViewBag
welcome @ViewBag.Guest !
ViewBag
ViewBag是“动态强类型”,无需转换
ViewBag.User = new User
{
RealName="泰森"
};
return View();
ViewBag
welcome @ViewBag.User.RealName !
ViewBag和ViewData在底层共用数据,因此两者可以混合使用
@{
Layout = "/Views/Shared/_Layout.cshtml";
ViewBag.Title = "About Contoso";
ViewData["Description"] = "Let us tell you about Contoso's philosophy and mission.";
}
@ViewData["Title"]...
ViewData 和 ViewBag 之间差异的摘要
image.png
传值至javascript
这种需求也是非常常见的,有两种方法
使用隐藏标签:
if ($("#errorInfo").val()) {
showNofity($("#errorInfo").val(), "danger");
};
隐藏标签也可以使用TagHelper轻松定义:
@Html.HiddenFor(x=>x.MyProperty)
直接获取(最方便)
var username = '@Model.Username';
//注意:viewbag或者viewdata直接这样拿会出现乱码
@*var guestname = '@ViewBag.User.RealName'*@
var guestname = '@Html.Raw(@ViewBag.User.RealName)';
alert(username + "/"+guestname);
注意,上面如果直接从js获取ViewData或者ViewBag数据将出现乱码,而要经过@Html.Raw转换才可以。
ajax获取
这个就不推荐了,spa用这个方法获取,mvc就没这个必要了