学习编程最主要的就是数据交互,MVC中数据交互是怎么样的呢?

1、Controller向View传输数据在http://www.cnblogs.com/WarBlog/p/7127574.html中有提到

2、View向Controller传递数据(提交数据)又是怎么样的呢?
①URL参数提交(Get方式)-- 根据MVC路由器规则

以下是POST方式

②传统Form表单Action方法提交

③Ajax异步提交

④MVC的HtmlHelper的Form表单提交(Html.BeginForm)

⑤MVC的Ajax的异步提交(Ajax.BeginForm)

3、详细分析上述提交方式

①URL参数提交(Get方式)

View端代码
<a href="/Stu/Modify/@stu.Id">修改</a> 路由表规则
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",//Stu/Modify/1
defaults: new { controller = "Stu", action = "RazorView", id = UrlParameter.Optional }
);

Controller控制器Action方法

[HttpGet]
public ActionResult Modify(int id)
{
return View(stu);
}

 ②传统Form表单Action方法提交

View视图代码

     <form action="/stu/modify" method="post">
<input type="hidden" name="Id" value="@Model.Id" />
<table>
<tr>@ViewBag
<td>姓名:</td>
<td><input type="text" name="Name" value="@Model.Name" /></td>
</tr>
<tr>
<td>班级:</td>
<td>
<td><input type="text" name="ClassName" value="@Model.ClassName" /></td>
</td>
</tr>
</table>
<input type="submit" value="确定" />
</form>

Controller控制器Action方法有三种方式:

1、Request.Form["Name"]

2、注意:View视图中Html控件name属性值和Model的属性名一致

模型绑定:.NetMVC框架会在调用action方法前,创建参数model对象,并从请求报文中检查看是否有与该对象属性同名的数据,如果有则设置给该对象同名的属性

所以可以直接以model对象作为参数传递

[HttpPost]
public ActionResult Modify(Models.Student model)
{
//Request.Form["Name"] DbEntityEntry entry = db.Entry<Models.Student>(model);
entry.State = System.Data.EntityState.Unchanged;
entry.Property("Name").IsModified = true;
entry.Property("CId").IsModified = true;
db.SaveChanges(); return Redirect("/stu/index");
}

3、使用FormCollection对象

 public ActionResult Modify2(FormCollection from)
{
return from["Name"]
}

③Ajax异步提交

View视图代码

 <form id="fData">
<table id="tbData">
<tr>
<td>姓名:<input type="hidden" id="Id" name="Id" /></td>
<td><input id="Name" type="text" name="Name" /></td>
</tr>
<tr>
<td>班级:</td>
<td>
<input id="ClassName" type="text" name="ClassName" />
</td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" id="GenderM" name="Gender" value="男" />男
<input type="radio" id="GenderF" name="Gender" value="女" checked />女
</td>
</tr>
<tr>
<td colspan="">
<input type="button" id="btnSure" value="确 定"/>
<input type="button" id="btnCancel" value="取 消"/>
</td>
</tr>
</table>
</form>

Ajax代码

     function DoModify() {
//1、可以通过Html标签ID属性获取数据,然后拼接josn格式数据
//2、使用serialize()只针对form对象可用
var data = $("#fData").serialize();
$.post("/Stu/Modify", data, function (jsonObj) {
if (jsonObj.Statu == "ok") {
...
}
}, "json");
}

④MVC的HtmlHelper的Form表单提交

1、@using (Html.BeginForm(string actionName(Action方法名),string controllerName(Controller控制器名),FormMethod method(提交方式:Get/Post--枚举类型),object htmlAttributes(Form标签的属性类))){}

注意:这个Html.BeginForm方法要结合using使用

View代码(强类型视图--指定了 model 类型的视图 就叫做强类型视图)

 @using (Html.BeginForm("ModifyPage", "Stu", FormMethod.Post))
{
@*@Html.TextBox("txtName", "我是文本框", new { style = "border:1px solid #0094ff;" });<br />*@
@*@Html.TextArea("txtContent", "我是文本域");*@
<table id="tbData">
<tr>
<td>@Html.LabelFor(s => s.Name):</td>
<td>
@*@Html.TextBoxFor(s=>s.Name)*@
@Html.EditorFor(s => s.Name)
@*@Html.ValidationMessageFor(s => s.Name)*@
</td>
</tr>
<tr>
<td>@Html.LabelFor(s=>s.CId):</td>
<td>
@Html.DropDownListFor(s=>s.CId,ViewBag.selList as IEnumerable<SelectListItem>)
@*@Html.DropDownList("CId",ViewBag.selList as IEnumerable<SelectListItem>)*@
</td>
</tr>
<tr>
<td>@Html.LabelFor(s=>s.Gender):</td>
<td>
<!--生成 单选按钮的 方法,会根据 属性值 与 默认值 比较,如果相等,则设置为 选中!-->
<!-- 也就是说,只要 当前Model中的Gender属性值,与 某个 单选按钮方法 设置的 value值一样,则自动设置为选中! -->
@Html.RadioButtonFor(s => s.Gender, "男") 男
@Html.RadioButtonFor(s=>s.Gender,"女") 女
</td>
</tr>
<tr>
<td colspan="">
<input type="submit" id="btnSure" value="确 定"/>
<input type="button" id="btnCancel" value="取 消"/>
</td>
</tr>
</table>
@Html.ValidationSummary()
}

上面View视图在使用htmlHepler方法生成HTML标签时,会自动把对象的属性名写入到HTML标签的name属性名(即HTML标签的name属性=对象的属性名,<input type = "text" name = "obName" value="@Model.obName">)

在提交时,就会把画面上所有数据都封装到model对象中,并传递到Controller控制器Action方法中。

Controller控制器Action方法

         [HttpPost]
public ActionResult ModifyPage(Models.Student model)
{
//服务器端 验证(根据实体类属性的 验证特性来检查)
if (!ModelState.IsValid)
{
return Content("数据有误~!请不要恶意禁用浏览器脚本~~~!");
}
try
{
DbEntityEntry entry = db.Entry<Models.Student>(model);
entry.State = System.Data.EntityState.Unchanged; entry.Property("Name").IsModified = true;
entry.Property("CId").IsModified = true;
entry.Property("Gender").IsModified = true; db.SaveChanges();
return Content("<script>alert('修改成功~');window.location='/Stu/Index';</script>");
}
catch (Exception ex)
{
return Content("<script>alert('失败~~~~" + ex.Message+ "');window.location='/Stu/Index';</script>");
}
}

2、就是使用BeginForm+EndForm

此方法和using(BeginForm)用法一样。

View视图代码

@{Html.BeginForm("Login", "User", FormMethod.Post, new { id = "form2" });}
<input type="text" />
@{Html.EndForm();}

注意:@{Html.BeginForm(string actionName(Action方法名),string controllerName(Controller控制器名),FormMethod method(提交方式:Get/Post--枚举类型),object htmlAttributes(Form标签的属性类)));}标注红色大【大括号和分号{ ;}】不加上的话,页面生成HTML代码中会显示【System.Web.Mvc.Html.MvcForm】字符串。

⑤MVC的Ajax的异步提交(Ajax.BeginForm)

View视图代码

 @{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script type="text/javascript" src="~/Scripts/jquery-1.7.1.min.js"></script>
<!--使用Ajax.BeginForm必须引用的js文件-->
<script type="text/javascript" src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script type="text/javascript">
function suc(resText) {
alert(resText);
}
function err(xhr) {
alert(xhr.readyState);
}
</script>
<style type="text/css">
#imgLoad {
display:none;
}
</style>
</head>
<body>
<h1>异步表单:</h1>
@using (Ajax.BeginForm("GetDate(Controller控制器的Action方法)", "Home(Controller控制器)", new AjaxOptions()
{
HttpMethod = "post",//提交方式
OnSuccess = "suc",//js方法
OnFailure="err",//js方法
LoadingElementId = "imgLoad"//Html标签ID
})) {
<input type="text" name="txtName" />
<input type="submit" />
<div id="imgLoad">加载中~~~</div>
} </body>
</html>

Controller控制器Action方法

 /// <summary>
/// MVC 的 Ajax Form
/// </summary>
public ActionResult GetDate()
{
System.Threading.Thread.Sleep(); string str = Request.Form["txtName"];
return Content(str + "," + DateTime.Now.ToString());
}

MVC学习八:MVC View提交数据的更多相关文章

  1. .NET MVC 学习笔记(六)— 数据导入

    .NET MVC 学习笔记(六)—— 数据导入 在程序使用过程中,有时候需要新增大量数据,这样一条条数据去Add明显不是很友好,这时候最好就是有一个导入功能,导入所需要的数据,下面我们就一起来看一下导 ...

  2. AntDesign(React)学习-4 登录页面提交数据简单实现

    github代码:https://github.com/zhaogaojian/jgdemo 全国肺炎,过节期间没地方去在家学习antd. 一.感觉antd pro项目太庞大了,可以学习下结构和代码风 ...

  3. HTML&CSS基础学习笔记1.27-input提交数据

    提交数据 我们在表单上填的信息很多情况下需要提交到后台. <input>的[type]属性值为“submit”时,表示提交表单数据.它在页面的表现形式也是个按钮,点击该按钮,表单数据将会提 ...

  4. 使用WebFrom来模拟一些MVC的MODEL与View的数据交互功能

    MVC中有一点非常闪瞎人眼的功能就是,可以根据Model与View视图来直接将页面也数据模型进行绑定,那么我们在想客户端发送页面时不需要进行各种控件赋值,不需要操心怎么渲染,当客户提交表单给服务器时也 ...

  5. MVC学习笔记---MVC导出excel(数据量大,非常耗时的,异步导出)

    要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式,后台开辟一个线程将excel导出到指 ...

  6. MVC中Control和View之间数据传递的方式

    1:ViewBag和ViewData 具体区别不做讨论,本处只演示ViewData的具体示例: Controler代码:ViewData["Employee"] = emp; Vi ...

  7. ASP.NET MVC 学习笔记之View 和Redriect的区别

    首先先说一下Redriect 和RedirectToAction 两个没什么区别,都是向浏览器发送302 Found相应,再有浏览器向对应的url进行请求 只是参数的意义不同而已 再说Redirect ...

  8. MVC js动态生成from提交数据然后生成文件下载

    前台: 点击触发下面事件 var turnForm = document.createElement("form"); //一定要加入到body中!! document.body. ...

  9. MVC学习笔记---MVC的处理管线

    漫步ASP.NET MVC的处理管线   ASP.NET MVC从诞生到现在已经好几个年头了,这个框架提供一种全新的开发模式,更符合web开发本质.你可以很好的使用以及个性化和扩展这个框架,但这需要你 ...

随机推荐

  1. 解决maven项目中,缺少 maven dependencies

    因为项目需要将普通项目转换为maven项目,在右键 ’项目‘configure 后,添加maven后,发现缺少 maven dependencies,于是从网上找了一些处理措施,大体上是在.class ...

  2. Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

    最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对“基数”以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了“HyperLogLog”,从而引出了Card ...

  3. java 用Graphics制作模糊验证码

    这篇随笔主要是java中制作验证码的效果,由于是在国庆前做的,现在也找不到原载了.我对自己整理的发表一份 生成的验证码效果如下: 一.建立一个工具类,用来生成验证码 package com.dkt.u ...

  4. Android学习——BroadCast(二)

    这篇博文介绍有序广播的使用 有序广播的发送 和普通广播完全相同,只需要更换发送的方式即可 ordered.setOnClickListener(new View.OnClickListener() { ...

  5. python mysql安装

    本文主要介绍不同系统mysql安装 mac安装mysql http://blog.csdn.net/pansanday/article/details/54915916   linux安装mysql ...

  6. 信用卡精养卡POS机方案

    所谓的精养卡,就是模仿有钱人的一种方式,提额难吗!真心不难,难就难在养卡消费 ,信用卡都有,但是不同费率的POS机你有吗,没有POS机难道你真的要去花费去消费吗,你消费的起吗?所以我们这个行业就出现了 ...

  7. SQL Server ->> SQL Server 2016功能改进之 -- Update Statistics

    1) 以前SQL Server更新一张表/索引的间隔是固定的,创建时更新一次,到了500行时更新第二次,接下来就是呈百分比式的间隔去更新,距离数据修改量达到表的行数量的的20%再次触发更新.但是这样的 ...

  8. C#中的多线程 - 高级多线程 z

    原文:http://www.albahari.com/threading/part4.aspx 专题:C#中的多线程 1非阻塞同步Permalink 之前,我们描述了即使是很简单的赋值或更新一个字段也 ...

  9. python全栈学习笔记(一)网络基础之网络协议篇

    阅读目录 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络协议 2.2 osi七层协议 2.3 tcp/ip五层模型讲解 2.3.1 物理层 2.3.2 数据链路层 2.3.3 ...

  10. Jquery学习---Easy UI 框架

    Jquery的easyui 1.1. easyui的目录分析 以 jquery Easy UI 1.3.2 版本学习 demo 实例 locale 国际化信息 plugins 框架一些插件 src 源 ...