MVC使用了using界定form表单范围:
@using (Html.BeginForm())@* 这里的Html前面没有@ *@ { }
默认是:Post到当前页面。
BeginForm()方法可以重载,通过参数指定Action/Controller/Method等,比如:
@*form表单会用 Get方法 提交到 HomeController 下的 Index(),还带着routeValue(id=3)*@ @using (Html.BeginForm("Index", "Home", new { id = 3 }, FormMethod.Get))
演示:
<form action="/Home/Index/3" method="get"> </form>
form标签中的表单元素,可以用原生的HMTL标签,也可以用@Html.TextBox():
@Html.TextBox("username")
演示:生成的HTML
<input id="username" name="username" type="text" value="">
用户的输入,后台(Action中)可以通过Request对象获得:
string username = Request.Form["username"];
似乎这样的写法也没什么用?确实如此,^_^,所以我们更多的时候,需要配合
使用TextBoxFor
@Html.TextBoxFor(m => m.Name)
F12演示其定义:
public static MvcHtmlString TextBoxFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression);
m,代表当前view上声明的model;m => m.Name,取model的Name属性。
演示:生成的HTML代码,input的name就是指定的model属性名:
<input id="Name" name="Name" type="text" value="">
这还是没用呀?!见证奇迹的时候:
这就是MVC的
当ASP.NET MVC接收一个HTTP请求的时候,它就会自动的:
注意:
#理解#:这一切(实例化Controller,调用Action,给它参数对象……)都通过反射实现:
Action本质上还是一个Controller的实例方法,它是被谁调用的呢?MVC框架,但MVC框架怎么知道有什么Controller什么Action呢?MVC的源代码可不可能这样:
new RegisterController().Index(new Student())
不可能的!所以只能通过反射,扫描整个项目,获得Controller的子类,以及他们的方法,并根据方法参数类型实例化对象……
PS:各种需要“高性能”的框架(ORM/MVC等)大量的应用反射,说明反射对性能的影响至少是“可以接受”的。
除了普通Model:
也会被自动赋值。
public ActionResult Index(int id, string name, bool gender )
数据源通常是:
断点演示:Action的参数值都如url所示
另:MVC是既可以给基本类型参数赋值,也可以给自定义类型(model)赋值(演示)。
如果参数是非可空类型,MVC有没法从前台获得相应的数据,比如URL为:/Register/Index/23,MVC就只能取得id=23,gender没值(=null)
这时候“没法绑定”,MVC会报错!
可以根据实际情况选择:
public ActionResult Index(int id, string name, bool gender = false )
public ActionResult Index(int id, string name, bool? gender )
实际开发中有可能Model的属性类型,不是基本类型而是自定义类型,比如:
public class Student { public int Id { get; set; } public Major Major { get; set; } //Major是自定义的
这种情况,在@Html.TextBoxFor()的时候,就需要:
@Html.TextBoxFor(m=>m.Major.Name)
一直点(.)到基本类型为止。
这样,生成的HTML:
<input id="Major_Name" name="Major.Name" type="text" value="">
MVC在Model绑定时,会根据key中的点(.),进一步的往下解析。比如先找到Major属性,根据它的类型实例化一个对象,再给对象的Name赋值——既然Name后面再没有点(.)了。
如果前端根本就没有向后台传递任何Major相关的值,Major为null值。
TextBox的参数比较简单,常用的有:
所有的HtmlHelper都可以传这个参数。通常用匿名类(也可以用IDictionary,都是“键值对”)赋值:
object htmlAttributes IDictionary<string, object> htmlAttributes
MVC会将其转换成HTML标签的属性。
@Html.TextBoxFor(m => m.Name, new { style = "background-color:blue;", //正常使用 @class = "form-control", zyf_username_duplicated = /*null*/ string.Empty })
说明:
如果不想这么“折腾”的话,可以使用IDictionary格式:
@Html.TextBoxFor(m => m.Name, new Dictionary<string, object> { { "style", "background-color:blue" }, { "class", "form-control" }, { "zyf-username-duplicated", null } } )演示生成的HTML标签:略
return View(new Student { BirthDay = DateTime.Now这时在TextBoxFor()中还可以传一个参数format,可以决定textbox的呈现格式。比如:
@Html.TextBoxFor(m => m.BirthDay, "{0:D}")
就会让文本框中日期格式变为:
更多格式可参见Microsoft Doc
另外,注意可空和非可空的区别:(演示)
多快好省!前端后端,线上线下,名师精讲
更多了解 加: