最近实在是太忙,客户丢了一个框架,没有任何说明文档,更没有所谓的技术支持,一直忙于学习,最后好歹还有点头绪,话不多说,MVC的学习是不能拉下的,就当前小白的我,认为MVC中的M并不是想象中的那样简单,一般用作前后台的数据交互。

什么是模型?什么是模型绑定?

微软出的《ASP.NET MVC 5编程实战》中有讲到,模型分领域模型、视图模型。个人理解视图模型就是一个数据库对应的实体类。领域模型狭义的来说包括视图模型和一些其他的属性。

视图传递参数+值(或实体对象),Action中接收。看似是一瞬间完成的。中间其实是需要经过两个步骤,①通过实现IValueProvider接口来获取视图中(Form、RouteData、QueryString、HttpFileCollection)请求值。②在通过实现IModelBind中的方法将这些获取的请求参数、值绑定到Action中对应的形参上。同样这里接口中方法都是默认去调用的,如果有需要,可以进行自定义编写实现其接口的方法。

比如,最常见的 将数据库中A表的部分数据显示在视图V中,然后进行增删该查操作。这里在视图V中,最上面会引用 该表的实体类@model  项目名.文件夹.实体类,再根据Razor语法,就可以用Lambda表达式点出来 该表的列名

创建--前台表单数据提交到Controller

@model MVC_plug.Models.Students
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true) <fieldset>
<legend>Students</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Stu_Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Stu_Name)
@Html.ValidationMessageFor(model => model.Stu_Name)
</div>

这里 浏览器解析Razor 语法是 将 BeginForm 解析为From表单,对于HTML来说是,是不存在实体类之说的,表单提交的值仅仅是以键值对的方式进行存储后提交到指定的Action中.也就是将视图中的请求参数与action中的形参进行匹配、绑定。这就是简单模型绑定。

1 .在Controller中对应的Action的方法体中 将 Student 作为参数来接收

        [HttpPost]
public ActionResult Create(Students students)
{
if (ModelState.IsValid)
{
db.Students.Add(students);
db.SaveChanges();
return RedirectToAction("Index");
} return View(students);
}

既然View中不存在将提交的内容绑定到 实体类中,那么输入的数据为什么在Action的参数Student中可以点出来? 实际上 View 中Post提交的数据 是以键值对的方式进行存储,然后映射到提交的Action中的 Student中,前提是 View中的键名(Name名字)必须要等于 实体类型的属性名,否则无法绑定

2.在Controller中对应的Action的方法体中直接设置参数来接收值 ()

 public ActionResult Create(string Stu_Name,string Tel,string phone)

运行项目,其中Stu_Name、Tel 有值,phone 无值,当然这只是佐证,如果在前台的View 中设置的名字不一样,后台用Student去接收,同样也会得到空值。

后台传递数据到前台

1. 显示某数据列表 ,同样是后台Controller 将 查询的结果 赋值给一个实体类对象,用反射也好,反序也行,再 Return View(实体类);

前台最上面要引用 @model 指向实体类 来接收传递的数据,因为是同一个实体,直接映射到前台,最后View 中进行显示即可

2. 当然还可以选择 ViewData 和ViewBag 在后台的Action中赋值,然后在View中接收,关于这两者的比较,这里简单的整理下

ViewData 的 ViewDataDictionary 是一个特殊的字典类,当在控制器中使用 ViewData["CurrentTime"] = DateTime.Now; 其实是将这个值以键值对的形式进行存储

ViewBag不再是字典的键值对结构,而是dynamic动态类型,它会在程序运行的时候动态解析

MVC 高级编程中提高两者的区别

①只有当要访问的关键字是一个有效的C#标识符时,ViewBag 才起作用。

例如,如果在ViewData["Key With Spaces"]中存放一个值,那么就不能使用ViewBag访问。因为这样根本就无法通过编译。

②动态值不能作为一个参数传递给扩展方法。因为C#编译器为了选择正确的扩展方法,在编译时必须知道每一个参数的真正类型。如果其中任何一个参数是动态的,那么就不会通过编译。

例如,这行代码就会编译失败:@Html.TextBox("name",ViewBag.Name)。要使这行代码通过编译有两种方法:第一是使用ViewData["Name"],第二是把ViewBag.Name值转换为一个具体的型:(string)ViewBag.Name 。

说白了,ViewBag 就是在ViewData的升级版,两者只能在Action中起作用,当然,两者的数据是可以相互访问。ViewBag的底层是ViewData,所以当两者定义同一属性不同值的时候,视图中显示的值永远是ViewData所定义的值

        // GET: Test
public ActionResult Index()
{ ViewBag.Name = "顓頊viewbag";
ViewData["Name"] = "顓頊viewdata";
return View();
}

前台视图中显示的值,均是  顓頊viewdata

    @Html.TextBox("Name",(string)ViewBag.Name)
<br/>
@Html.TextBox("Name",ViewData["Name"])

此外当用 TextBoxFor +强类型视图时,若在控制器中给实体类赋值,视图中又用New{ Value=“” } 来赋值,则实体对象中的值将被覆盖。

        public ActionResult Index()
{ Test te = new Test();
te.Name = "顓頊";
TestViewModel testViewModel = new TestViewModel()
{
test = te,
Tests = new List<Test>()
}; ViewBag.Name = "顓頊viewbag";
ViewData["Name"] = "顓頊viewdata"; return View(testViewModel);
}

如下视图均显示颛顼viewdata(Value中首字母V需大写)

    @Html.TextBoxFor(m => m.test.Name,new { Value= ViewData["Name"]})
<br />
@Html.TextBoxFor(m => m.test.Name, new { Value = (string)ViewBag.Name })

市人皆大笑,举手揶揄之

MVC 中的Model对象的更多相关文章

  1. Asp.net MVC中提交集合对象,实现Model绑定

    Asp.net MVC中的Model自动绑定功能,方便了我们对于request中的数据的处理, 从客户端的请求数据,自动地以Action方法参数的形式呈现.有时候我们的Action方法中想要接收数组类 ...

  2. Asp.net MVC中提交集合对象,实现Model绑定(转载)

    Asp.net MVC中的Model自动绑定功能,方便了我们对于request中的数据的处理, 从客户端的请求数据,自动地以Action方法参数的形式呈现.有时候我们的Action方法中想要接收数组类 ...

  3. ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例

    在实际的ASP.NET mvc项目开发中,有时会遇到一个参数是一个List.Dictionary等集合类型的情况,默认的情况ASP.NET MVC框架是怎么为我们绑定ASP.NET MVC的Actio ...

  4. ASP.NET MVC中对Model进行分步验证的解决方法

    原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个 ...

  5. asp.net MVC中的@model与Model

    asp.net MVC中的@model与Model https://blog.csdn.net/ydm19891101/article/details/44301201 在MVC的实际使用中,我们经常 ...

  6. ASP.NET Core MVC 中的 Model 模型

    ASP.NET Core MVC 中的 Model 我们希望最终从 Student 数据库表中查询特定的学生详细信息并显示在网页上,如下所示. MVC 中的模型包含一组表示数据的类和管理该数据的逻辑. ...

  7. 关于MVC中模型model的验证问题

    今天在做项目练习的时候发现,MVC中使用自带的模型验证时会提前显示在界面上,比如下面所示: 这是什么原因了,是因为我在表示get请求的action里面返回了其界面所显示使用的model,我们知道mvc ...

  8. Asp.net MVC 中的TempData对象的剖析

    另一篇文章,也对TempData 做了很详细的介绍,链接地址:https://www.jianshu.com/p/eb7a301bc536   . MVC中的 TempData 可以在Controll ...

  9. Spring MVC中如何传递对象参数

    springController: @Controller @RequestMapping("/user") public UserController extends BaseC ...

随机推荐

  1. 几种Linux 查询外网出口IP的方法(转)

    原文:http://www.cnblogs.com/wudonghang/p/354289a61129731e7d2075968356e6ad.html Curl 纯文本格式输出: curl ican ...

  2. 【托业】【新托业TOEIC新题型真题】学习笔记13-题库四-P7

    >counterpart 对应的人 >Master of Business Administration 工商管理学硕士 >superb 极好的 >executive 执行总监 ...

  3. Vue通过build打包后 打开index.html页面是空白的

    最近在build打包vue项目遇到了几个问题,如下: 1.npm run build打包项目之后,我们通常是把dist文件里面被压缩后的static文件跟index.html提交到服务器,但最近发现直 ...

  4. 【Oracle】使用bbed手动提交事务

    有时候数据库挂掉,起库会出现ORA-00704错误,而导致ORA-00704错误的根本原因是訪问OBJ$的时候.ORACLE须要回滚段中的数据,而訪问回滚段的时候须要的undo数据已经被覆盖,此时我们 ...

  5. UICollectionView横向分页

    效果图: 代码: HCollectionViewCell.h #import <UIKit/UIKit.h> @interface HCollectionViewCell : UIColl ...

  6. UIBezierPath使用

    效果图,Demo的例子是我自己做的,下面曲线的代码是从别处copy过来的 copy地址 -(void)touchesBegan:(NSSet<UITouch *> *)touches wi ...

  7. SQL SERVER 2016研究一

    一.安装SQL Server 2016 安装检查提示异常: 安装补丁: 根据系统判断补丁安装顺序,按顺序安装 Windows server 2012 R2 安装SQL补丁如下以及JDK: 安装完成 二 ...

  8. rem、em 、font-size随着屏幕大小的改变而改变

    rem  的根标签是html 以html标签上设置的font-size的值为参考点 如: <div id="app"> <div id="son> ...

  9. Cartographer源码阅读(2):Node和MapBuilder对象

    上文提到特别注意map_builder_bridge_.AddTrajectory(x,x),查看其中的代码.两点: 首先是map_builder_.AddTrajectoryBuilder(...) ...

  10. Linux学习和ROS安装(1)

    参考文档:https://www.cnblogs.com/liu-fa/p/5779206.html#undefined 系统环境:Window7 64bit+VMware11 ubuntu-gnom ...