tnblog
首页
视频
资源
登录

MVC页面间的传值的大致解析*

7335人阅读 2019/10/30 15:05 总访问:400803 评论:0 收藏:0 手机
分类: .NET MVC

自我觉得挺实用的


我依旧喜欢喧哗,却又与其格格不入


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


回顾

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

a). QueryString(也叫URL传值)

b). Session

c). Cookie

d). Application

e). Server.Transfer

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


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中书写

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

前台接收

  1. @TempData["tmpData"]

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


4. Model

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

@model IEnumerable<MVC5Demo.Models.UserInfoViewModel>

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


  1. <tbody>
  2.     @foreach (var item in Model) { 
  3.     <tr>
  4.         <td>@Html.DisplayFor(p => item.UserName)</td>
  5.         <td>@(item.Sex == 0 ? "女" : "男")</td>
  6.         <td>@Html.DisplayFor(p => item.Age)</td>
  7.         <td>@Html.DisplayFor(p => item.Dept)</td>
  8.         <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>
  9.     </tr>
  10.     }
  11. </tbody>


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

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

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

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

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(...)方法提交表单


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


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

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

  1. <form id="postForm" action="@Url.Action("Save")" method="post">   或者action="/controller/view"
  2.             <div>表单内容</div>
  3.             <div>...</div>
  4.             <input type="submit" value="提交表单" />
  5.     </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之间传递,并且具有‘一次访问’的特质。使用时要特别注意。


3.传递普通对象


//controller

viewBag.list = new List<object>{

...

};

//view

var list = (List<object>)viewBag.list;


注意:object可以换成任意类型,现在可以很方便的传递任何值或对象了.


与WebForms传值的对比

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

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

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


是不是感觉涨知识了



评价

.net MVC分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

三分钟快速复习MVC知识

读这篇文章不意味着你一定要去并且能搞定MVC面试。这篇文章的目的是在面试之前让你快速复习MVC知识。什么是MVC (模型 视图 ...

Idea下使用maven搭建SSM(一):SpringMVC

Spring MVC是一款基于MVC架构模式的轻量级Web框架,其目的是将Web开发模块化,对整体架构进行解耦,简化Web开发流程。下面...

C MVC RedirectToAction跳转时候传递参数,Action之间传值

MVC Action之间传值,页面跳转传值方法一:路由传值很简单直接使用 RedirectToAction(string actionName, string controller...

.net MVC 登录后跳回原来的页面

把当前连接传递到登录界面,然后登录后根据那个连接跳转回来就好跳转前可以使用Request.Url获取当前页面的地址:&lt;ahref=...

在idea下搭建Spring Boot+Spring MVC+thymeleaf

今天大兄弟来讲一下在idea下,使用Spring Boot ,搭建Spring MVC+thymeleaf。在Java开发领域,Spring Boot算得上是一颗耀眼...

MVC过滤器

过滤器:过滤器(filter):是基于AOP(面向接口编程)的设计,它的作用是对MVC框架处理客户端请求注入额外的逻辑。本质:...

asp.net MVC @helper用法

@helper可以在视图定义一个公共块,这样就可以实现代码的重复调用下面来一个很简单的例子:就是输出一个list的数据。实际项...

扩展MVC实现model直接传递匿名对象

如果我们直接通过model传递匿名对象,是不行滴后台通过model传递一个匿名对象publicActionResultIndex() { returnView(ne...

ASP.NET MVC从请求到响应发生了什么

先就贴一张图哦在来一张

.net core MVC中其他类库获取appsettings.json

appsetting:{ &quot;ApplicationSettings&quot;:{ &quot;DalAssemblyName&quot;:&quot;INGEFDal&quot; }, ... }c#:pu...

.NET MVC 使用百度编辑器详细教程:(1)配置编辑器

一、什么是百度编辑器百度编辑器UEditor是由百度web前端研发部开发一款应用于网站的编辑器,具有轻量,可定制,注重用户体...

Asp.net MVC 利用(aspose+pdfobject.js) 实现在线预览office文档

Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,通过它,我们可以有计划地操纵一些商业中最流行的文件格式...

asp.net MVC 下载文件

方法1:publicvoidDownLoad() { stringfilePath=&quot;文件路径&quot;; using(FileStreamfs=newFileStream(filePath,Fil...

ASP.NET MVC + WebUploader+BootStrap实现文件上传进度条显示

引入需要的资源文件:&lt;scriptsrc=&quot;~/Content/jquery-1.9.1.min.js&quot;&gt;&lt;/script&gt; &lt;linkhref=&quot;...

ASP.NET MVC + WebUploader实现文件上传二:使用中的一些问题

如何把文件选择按钮换成自己的因为WebUploader设置关联的上传id会有他的样式,有时候想换成自己的开始想的是添加自己的文件...
你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
13
文章
64
粉丝
20
评论
30
MUI框架页面间的传值指针
XingDy姐 : 不错哦
MUI框架页面间的传值指针
剑轩 : 接口的真实地址可以用xx/yy什么的代替哦,真实地址还是隐藏一下好
.NET EF 用户按钮权限
YOU : 可以,在写文章的时候,有需要写代码的地方,可以选择编辑器上的代...
.NET EF 用户按钮权限
剑轩 : 哈哈哈哈,你这个追女生的逻辑
EF三种模式解析
剑轩 : 好文采!
重要sql语句和linq,lamdba分组条件查询语句
剑轩 : 开头那句诗句写得很好哇!
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
科研成就的上限在于你的想象力。