mvc页面间的传值

本文大致讲解mvc前后端的传值方式,包括control向view、view向control、以及action向action。

回顾

我们回顾下在ASP.NET WebForms中,页面之间最常用的传值方式,有以下几种:

a). QueryString(也叫URL传值)

b). Session

c). Cookie

d). Application

e). Server.Transfer

这里不再讲述这几种传值方式的用法和利弊,在本章后面将用MVC的传值方式与之对比,并展开一些探讨。(webform传值请看其他章节)

1、Controller向View传值

可以通过viewbag、viewdata、TempData、model。

1. ViewBag

用法:

在Controller中书写

ViewBag.Test123 = "Hello World.";

前台接收

@ViewBag.Test123

说明: ViewBag是dynamic动态类型,上面例子中的key => Test123可以指定任何类型。

2. ViewData

用法:

在Controller中书写

ViewData["Test123"] = "Hello World. This is ViewData";

前台接收

@ViewData["Test123"]

说明:ViewData是字典类型,继承自IDictionary<string,object>接口

3. TempData

用法:

在Controller中书写

TempData["tmpData"] = "I am TempData...";

前台接收

@TempData["tmpData"]

说明:TempData也是字典类型,继承自IDictionary<string,object>接口

4. Model

这是初学者最常使用的传值方式。在上一篇文章中, 我们在Razor视图的页面代码中有这样一句:

@model IEnumerable<MVC5Demo.Models.UserInfoViewModel>

然后我们的信息列表是这样:

<tbody>
    @foreach (var item in Model) {
    <tr>
        <td>@Html.DisplayFor(p => item.UserName)</td>
        <td>@(item.Sex == 0 ? "女" : "男")</td>
        <td>@Html.DisplayFor(p => item.Age)</td>
        <td>@Html.DisplayFor(p => item.Dept)</td>
        <td>@Html.ActionLink("编辑", "Edit", "UserInfo", new { id=item.UserID.ToString() },null) @Html.ActionLink("删除", "Delete", "UserInfo", new { id = item.UserID.ToString() }, new { onclick="return confirm(‘确认删除"+item.UserName+"的记录?‘);" })</td>
    </tr>
    }
</tbody>

如代码所示,因为我们的Model是一个泛型集合,这里就可以很方便的取出集合中的数据。

在后台Controller中,是怎么书写的呢?

public ActionResult Index()
        {
            return View("UserInfo", GetTestData());//GetTestData()返回泛型集合
        }

如代码所示,只需返回视图时,同时指定视图的数据对象。

View向Controller传值

1. 使用Html.BeginForm(...)方法提交表单

@using(Html.BeginForm("actionName","controllerName"))
    {
        <div>表单内容</div>
        <div>...</div>
        <input type="submit" value="提交表单" />
    }

说明:将 <form> 开始标记写入响应。在用户提交窗体时,将由某个操作方法(指定Controller的某个Action)处理该请求。

(使用using关闭form,下面不再说明。)

2. 使用Html.BeginRouteForm(...)方法提交表单

@Html.BeginRouteForm("路由名称", new { controller = "userinfo", action="save", userID = Model.UserID, userName = Model.UserName }, FormMethod.Post)
    {
        <div>表单内容</div>
        <div>...</div>
        <input type="submit" value="提交表单" />
    }

说明:同Html.BeginForm(),但使用路由方式提交表单,同时参数也不同。

3. 传统Form表单的Action属性提交

<form id="postForm" action="@Url.Action("Save")" method="post">
            <div>表单内容</div>
            <div>...</div>
            <input type="submit" value="提交表单" />
    </form>

说明:使用传统html form原生标记。

4. 使用Ajax方式提交表单, Ajax.BeginForm(...)

@Ajax.BeginForm("actionName", new AjaxOptions { Url="",OnSuccess="",HttpMethod="get" })
    {
        <div>表单内容</div>
        <div>...</div>
        <input type="submit" value="提交表单" />
    }

说明:使用异步方式提交form表单。

5. Jquery和Ajax提交表单

省略... 不在文章讨论范围。

6. 表单参数传递

6.1 全参数传递

[HttpPost]
public ActionResult Save(string username,int sex,int age,string dept)

说明:html标签name和参数名需相同。

6.2 实体传参

[HttpPost]
public ActionResult Save(UserInfoViewModel item)

说明:页面使用@model绑定类型

6.3 表单集合传参

[HttpPost]
public ActionResult Save(FormCollection fc)

说明:需解析FormCollection,如:

UserInfoViewModel userInfo = new UserInfoViewModel();
TryUpdateModel<UserInfoViewModel>(userInfo, fc);

6.4 传统方式

使用HttpContext,在MVC中我们同样可以使用以下对象:

Application,Server,Session,Request,Response,Cache ...

Controller向Controller传值(Action之间传值)

1. RedirectToAction

1.1 传递实体对象

public ActionResult Index()
        {
            return RedirectToAction("Index", "Home", new UserInfoViewModel { UserID = Guid.NewGuid(), UserName = "zhangsan", Sex = 1, Age = 20, Dept = "hr" });
        }

说明:在UserInfoController中,在页面加载时,新建一个实体类型,并跳转至首页。

接收:

public class HomeController : Controller
    {
        public ActionResult Index(UserInfoViewModel model)
        {
            //处理model的值
            //...
1.2 传递普通参数
public ActionResult Index()
        {
            return RedirectToAction("Index", "Home", new { UserID = Guid.NewGuid(), UserName = "zhangsan"});
        }

接收:

public class HomeController : Controller
    {
        public ActionResult Index(string userID,string userName)
        {
            //处理userID, userName的值
            //...

2. TempData

TempData["userName"] = "zhangsan";
            return RedirectToAction("Index2");

在Index2中接收:

string userName = TempData["userName"].ToString();

说明:TempData可以在同Controller中不同Action之间传递,并且具有‘一次访问’的特质。使用时要特别注意。

与WebForms传值的对比

1. 后台不能通过非提交方式获取某个页面元素的值,因为没有‘服务器控件’;MVC使用原生Http,是【无状态】的。

2. 不能使用(也没有)ViewState。

3. 使用特有的机制传值(ViewData,ViewBag...等等)。

时间: 2024-10-12 16:55:50

mvc页面间的传值的相关文章

B/S结构中页面间的传值

常见的页面间的传值有session,cookie,application,server.transfer(),queryString,今天主要记录一下server.transfer()的用法. 从A页面Transfer到B页面时,就可以在B页面通过Context.Handler获得A页面的一个类的实例,从而在B调用A的各个成员对象. 下面的示例建立了AA和BB, 通过Server.Transfer()方法演示在BB中读取AA的文本框.读取属性.通过Context传值.调用AA的方法等. AA上放

父页面与子页面间相互传值

父页面与子页面间相互传值 1.子页面又父页面通过window.open弹出 子页面要向父页面传值,只要在document前面加window.opener即可.如:父页面: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

用block实现两个页面间的传值

第二个view声明一个block属性: @property (nonatomic, copy) void(^doTransferMsg)(NSString *_msg); 然后传值方法里检查block是不是存在 - (IBAction)transferText:(UIButton *)sender { if (_doTransferMsg) { _doTransferMsg(@"hello there"); _doTransferMsg = nil; } [self.navigatio

HTML5 Web存储 页面间进行传值

在实际使用过程中,经常会遇到需要在页面间进行传值的情况,最初设想一定需要后端才能进行数据的存储和读取,或者在本地使用一个cookie进行保存,直到了解到HTML5 Web存储 使用HTML5的新特性可以在本地存储用户的浏览数据.Web 存储需要更加的安全与快速. 这些数据不会被保存在服务器上,数据只用于用户请求网站数据上.它也可以存储大量的数据,而不影响网站的性能. 数据以“键/值”对存在, web网页的数据只允许该网页访问使用 方法: localStorage 和 sessionStorage

基于HTML5之APP页面间的传值的几种方式

一 摘要 在做APP开发时,避免不了出现两个页面之间的传值,在iOS开发中两个页面传值常见的有:属性传值,block,代理,通知等方式.那么web程序两个页面传值的形式有哪些呢,在这里我给大家总结一下. 1)PC版的web程序 两个两个页面之间的传值方式主要有: 1.cookie 2.查询字符串 3.还可以通过服务端的session来交换数据 2)HTML之app的传值方式 主要有: 1.HTML5 LocalStorage 本地存储 2.隐藏字段 3.服务器端的session等 4..页面已创

jsp页面间的传值方法

JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp?action=transparams&detail=directe">直接传递参数< /a> 特别的在使用response.sendRedirect做页面转向的时候,也可以用如下代码: response.sendRedirect("thexuan.jsp?acti

利用Swift之协议语法实现页面间的传值功能

随着Swift 新开发语言的发布,又随着Xcode6.0.1的正式发布,利用swift编写iOS代码迫在眉睫,笔者在使用Objective-C开发近三年以来,对这种优雅的语法深感赞叹,下面我将对比式的实现一个页面传值的demo,使用语法是swift,页面传值是学习iOS初期必修的demo,因为涉及一个非常难懂的语法:协议和委托,这里涉及的swift语法和一些基本操作我不在一一赘述,如果方便可下载IT面试宝典APP,里面有对其详细介绍,那就开门见山吧,用代码实现以下功能: 1,创建Swift工程,

从UWP到Swift-页面间反向传值

页面1跳转到页面2,在页面2点击button后,页面1的内容被改变.实际使用 protocol(就是c#中的interface),将页面1的viewcontroller转换为protocol传入页面2的viewcontroller,非常类似于我们在c#中开发将_viewController转成接口传入其他自定义控件等中,实际就是在页面2放置一个引用,在swift里面这种做法叫委托,c#中也有. 这种思路应该是面向接口编程的一种体现,利用接口进行解开耦合.我现在能慢慢明白,其实swift之中的vi

laravel页面间的传值

可以在前端页面元素上添加onclick事件  onclick='selectRaw(this)' js中写function selectRaw(obj){ var data=$(obj).attr("name"); window.location.href='../../video/audit/'+data; } 然后在页面二获取url中的data,<?php echo $data ?> 其他传值方法见http://my.oschina.net/jiec/blog/1961