asp.net core.NETASP.NET Core见识录

asp.net mvc 项目后台向页面传值

2019-06-20  本文已影响2人  Angeladaddy

一直想整理一下这个内容,今天终于有空(kun nan)了。

传值方式

强类型参数传值-ViewModel

// controller
        public IActionResult Index()
        {
            var User = new User
            {
                Username="kingofyongchun",
                RealName="叶问",
            };
            ViewData["title"] = "传值测试";
            return View(User);
        }
@{
    Layout = null;
}
@model TestProject.ViewModels.User
<!DOCTYPE html>
<html>
<head>
    <title>@ViewData["title"]</title>
</head>
<body>
    <h1>viewmodel</h1>
    <p>username: @Model.Username</p>
    <p>realname: @Model.RealName</p>
</body>
</html>

弱类型数值传递

弱类型数据的适用情形举例:


image.png

ViewData

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>
    @address.Name<br>
    @address.Street<br>
    @address.City, @address.State @address.PostalCode
</address>

控制器中也可以使用[ViewData]特性声明

    public class TestController: Controller
    {
        [ViewData]
        public string Message { get; set; }= "what a  killing hot day!";
        
        // GET: /<controller>/
        public IActionResult Index()
        {
            var User = new User
            {
                Username="kingofyongchun",
                RealName="叶问",
            };

            ViewData["title"] = "传值测试";
            ViewBag.Guest = "泰森";
            return View(User);
        }
    }
@{
    Layout = null;
}
@model BioVR.Entities.Models.User
<!DOCTYPE html>
<html>
<head>
    <title>@ViewData["title"]</title>
</head>
<body>
    <h1>ViewModel</h1>
    <p>username: @Model.Username</p>
    <p>realname: @Model.RealName</p>
    <h1>ViewData</h1>
    <p>@ViewData["Message"]</p>
    <h1>ViewBag</h1>
    <p>welcome @ViewBag.Guest !</p>
</body>
</html>

ViewBag

 ViewBag.User = new User
{
   RealName="泰森"
}; 
return View();

<h1>ViewBag</h1>
<p>welcome @ViewBag.User.RealName !</p>
@{
    Layout = "/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About Contoso";
    ViewData["Description"] = "Let us tell you about Contoso's philosophy and mission.";
}
<!DOCTYPE html>
<html lang="en">
<head>
    <title>@ViewData["Title"]</title>
    <meta name="description" content="@ViewBag.Description">
    ...

ViewData 和 ViewBag 之间差异的摘要

image.png

传值至javascript

这种需求也是非常常见的,有两种方法

  1. 使用隐藏标签:
<input id="errorInfo" type="hidden" value="@ViewBag.ErrorInfo" />
<script>
    if ($("#errorInfo").val()) {
        showNofity($("#errorInfo").val(), "danger");
    }; 
</script>

隐藏标签也可以使用TagHelper轻松定义:

@Html.HiddenFor(x=>x.MyProperty)
  1. 直接获取(最方便)
    <script>
        var username = '@Model.Username';
        //注意:viewbag或者viewdata直接这样拿会出现乱码
        @*var guestname = '@ViewBag.User.RealName'*@
       var guestname =  '@Html.Raw(@ViewBag.User.RealName)';
        alert(username + "/"+guestname);
    </script>

注意,上面如果直接从js获取ViewData或者ViewBag数据将出现乱码,而要经过@Html.Raw转换才可以。

  1. ajax获取
    这个就不推荐了,spa用这个方法获取,mvc就没这个必要了
上一篇下一篇

猜你喜欢

热点阅读