创建--前台表单数据提交到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中.
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中起作用,当然,两者的数据是可以相互访问
本文转自xsster51CTO博客,原文链接:http://blog.51cto.com/12945177/1950802 ,如需转载请自行联系原作者
mvc