View视图之在Action动作方法中传递参数给视图

View(视图)的职责是向用户提供界面,负责根据提供的模型数据生成准备提供给用户的格式界面,并提供用户与系统交互的入口。

View和Action之间前后台数据传递的方式

弱类型 ViewData[“paramName”]
动态类型 ViewBag[“paramName”]
强类型 Model
临时存储 TempData[“paramName”]
后台:return View(data) //存入ViewData.Model
前台:Model //其实就是WebViewPage.Model

Controller控制器:

Demo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC_Project01.Controllers
{   /// <summary>
    /// 控制器
    /// </summary>
    public class HomeController : Controller
    {
        // GET: Home
        //动作方法:Index()
        public ActionResult Index()
        {
            int[] nums = {10,20,30,40,50,60};
            //ViewBag.numsArrayCount = nums.Length;
            ViewBag.date = DateTime.Now;
            ViewData["numsArrayCount"] = nums.Length;


            TempData["newType"] = "体育新闻";
		    //强类型视图传递Model数据
            return View(new User() { Name="jack", Age=25, Gender="male", Address="USA"});//对应的view:Index  不区分大小写

        }

        
        public ActionResult NewList()
        {
            return View();//对应的view:NewList     不区分大小写
        }
    }
}

使用ViewBag属性给当前动作方法对应的view传递临时参数
格式:
ViewBag.key=value;

使用ViewData属性给当前动作方法对应的view传递临时参数

格式:
ViewBag[key]=value;

传递的参数既可以是简单类型,也可以是复杂的数据类型(对象、数组、集合等等)

问题:
如果在Action动作方法里,不使用模型传参的方式(将model传递到View()方法),而是使用ViewBag、ViewData、TempData传递对象参数给View视图,在前台View中需要获取对象属性或者调用方法又该如何处理?

Demo:
准备实体类User:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MVC_Project05.Models
{
    public class User
    {
        public int UserId { get; set; }
        public string UserName { get; set; }
        public int Age { get; set;}
        public string Telephone { get; set; }
    }
}

在Controller中添加动作方法:

 public ActionResult GetCurrentTime() {

            User user = new User() {
                UserId=10101,
                UserName="paul gasol",
                Age=36,
                Telephone="0568-5598565-9612"
            };
            //注意: View(string viewName) 传入的时候切记如果是字符串类型,一定是视图名称

            ViewBag.Message = "you are my destinty!";
            ViewBag.Date = DateTime.Now;
            ViewBag.User = user;
            return View();
            //return View(DateTime.Now);
        }

添加Action方法对应的View视图GetCurrentTime.cshtml,然后在该视图中获取Action传递的数据:

@*
    model关键字指定视图的模型类型

    强类型视图:实际上就是给视图声明了一个类型参数,
    渲染视图时必须强制传入对应的类型对象
    ( 在对应的动作方法里,必须在View()方法里传入Model),
    否则将引发异常
*@

@*@model DateTime*@

@*引入Model类所在命名空间*@
@using MVC_Project05.Models

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>获取当前时间</title>
</head>
<body>
    <div>
        @*<p>当前时间:@Model.ToShortTimeString()</p>*@
        @* 
        当接收从Acton传递来的参数(非Model传参方式)
        使用ViewBag、ViewData、TempData
        可以在Rasor表达式中先获取传递的对象,再获取其属性,
        或调用其方法获取一些值
        *@
        @{
            DateTime date = @ViewBag.Date;
            string currentDate = date.ToShortTimeString();
            User user = @ViewBag.User;
            string userName = user.UserName;
            int userId = user.UserId;
            int age = user.Age;
            string telephone = user.Telephone;
        }
        <p>Current Time:@currentDate</p>
        <p>用户个人信息:</p>
        <p>用户编号:@userId</p>
        <p>用户姓名:@userName</p>
        <p>年龄:@age</p>
        <p>电话号码:@telephone</p>
    </div>
</body>
</html>

Result:
在这里插入图片描述

分析:
对于自定义实体类,在前台View中,如果在Rasor表达式要使用,首先需要使用@using表达式引入其所在命名空间

注意:
ViewBag和ViewData只能向当前view传递数据
但是TempData可以向不同的Action传递数据,但是TempData的值在取了一次之后将被自动删除。

TempData的目的:
在一次请求中同时执行的多个Action之间共享数据

那么就可以在Action方法对应的view中获取共享数据

Index动作方法对应视图Index.cshtml:
在视图中读取在Action动作方法中传递的数据


@*
    使用@model语句声明通过动作方法传递给该视图模型对象(Model)的类型
    
*@
@model MVC_Project01.Models.User


@{
    Layout = null;
}


<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>首页</title>
    <style>
        ul {
           list-style:none;
        }

    </style>
</head>
<body>
    <div>
        <p>这是首页,欢迎光临!</p>
        <p>
            <label>Number Count:</label>
            @*@ViewBag.numsArrayCount*@

            @ViewData["numsArrayCount"]
        </p>

        <p>时间: @ViewBag.date</p>

		@*<p>新闻类型: @TempData["newType"]</p>*@
	        
        <ul>
            @*    
                使用@Model来引用视图模型对象的方法、字段或属性
            *@

            <li>UserName:@Model.Name</li>
            <li>Age:@Model.Age</li>
            <li>Gender:@Model.Gender</li>
            <li>Address:@Model.Address</li>
        </ul>
    </div>
</body>
</html>

在NewList动作方法对应的视图NewList.cshtml中,获取在Index动作方法中,使用TempData传递的数据


@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>新闻列表页</title>
</head>
<body>
    <div>
        <p>这是新闻列表页,欢迎光临!</p>
        <p>新闻类型: @TempData["newType"]</p>
    </div>
</body>
</html>

总结:
ViewData是字典型(Dictionary)(object类型),而ViewBag不再是字典的键值对结构,而是dynamic类型,dynamic类型与object类型的区别是在使用时dynamic会根据数据类型自动转换,而object类型则需要我们手动进行强制转换。

ViewData和ViewBag传递参数的生命周期和当前View相同,view加载完毕,其参数也被释放掉了。
TempData在同一个Controller中可跨多个Action动作方法传递参数,但只要取了一次就会被自动删除,起到的是一种共享数据的作用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值