最近实在是太忙,客户丢了一个框架,没有任何说明文档,更没有所谓的技术支持,一直忙于学习,最后好歹还有点头绪,话不多说,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. 内置函数time

    time   import time.time() # 浮点型,给计算机看,随机 时间有三种: First: 时间戳  (time.time()) Second: 结构化时间  可以修改 Third: ...

  2. vue中封装一个全局的弹窗js

    /** * Created by yx on 2017/12/21. */ export default { /** * 带按钮的弹框 * <!--自定义提示标题,内容,单个按钮事件--> ...

  3. EXPLAIN执行计划中要重点关注哪些要素(叶金荣)

    原文:http://mp.weixin.qq.com/s/CDKN_nPcIjzA_U5-xwAE5w 导读 EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORA ...

  4. word2vec训练好的词向量

    虽然早就对NLP有一丢丢接触,但是最近真正对中文文本进行处理才深深感觉到自然语言处理的难度,主要是机器与人还是有很大差异的,毕竟人和人之间都是有差异的,要不然不会讲最难研究的人嘞 ~~~~~~~~~~ ...

  5. IntelliJ IDEA Ultimate 下载与安装

    一.下载 Intellij IDEA Ultimate 下载链接:https://www.jetbrains.com/idea/download/#section=windows 1.进入官网点击Ul ...

  6. MySQL innodb_flush_method 【转载】

    innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O ...

  7. MongoDB的客户端管理工具--nosqlbooster 连接MongoDB服务器

    nosqlbooster的官网地址为https://nosqlbooster.com.大家如果想直接下载,可以登入下载网址https://nosqlbooster.com/downloads. 下载w ...

  8. Laravel展示产品-CRUD之show

    上一篇讲了Laravel创建产品-CRUD之Create and Store,现在我们来做产品展示模块,用到是show,①首先我们先修改controller,文件是在/app/Http/Control ...

  9. Java-idea-常用插件-lombok

    1.插件安装 打开perferences或者settings,找打plugins,选择Browse repositories...,搜索lombok,下载安装重启即可. 2.支持的注解: 2.1.@G ...

  10. RN-系列

    8081端口被占用,McAfee Agent关不掉 sudo lsof -n -i4TCP:8081 sudo launchctl list | grep 5693 sudo launchctl re ...