ASP.NET Core 六:模型与模型绑定,模型特性,客户端提交可能会遇到的坑
概念说明:
最佳方法:比如我们用表单访问服务器的时候,用Asp-Action=“SaveValue”来指定方法名称,系统会在控制器下找到一个叫做SaveValue的最佳方法来调用,默认并不会在意这个方法是否有参数,或者参数是什么类型(除非有【Post】或者【Get】特性限制)
模型绑定,是指我们在服务端访问客户端的时候,服务端的数据数据的实例化。实例化的数据包含控制器的属性,方法的参数。通常情况下对于方法,系统会提供默认参数的绑定。
数据类型,系统提供了基本类型,复合类型(class),数组类型,字典,文件类型等大部分数据类型的模型绑定,以及自定义类型。
但是正如我们前面提过,官方只是提供了一个普遍的解决方案,我们仍然可以通过访问HttpContext自定义处理具体的数据。
模型特性,模型特性可以用于设置模型的属性名称,长度,是否可绑定等等
自定义模型绑定,可以自定义自己的模型绑定,而不使用系统提供的绑定。
对于模型我们可以设置参数,比如[BindProperty(Name=xx)]来指定对应的关键名称
模型主要是通过名称来绑定,我们可以通过给模型的属性设置注解Display(Name="xx")来设置对应的名称,如果没有设置,系统默认使用标识符作为名称
参考官方文档:ASP.NET Core 中的模型绑定 | Microsoft Docs
模型绑定:
下面我们可以看到,无论是属性还是参数都可以进行模型绑定
public class TestInfo { public string Id { get; set; } public string Name { get; set; } public string Des { get; set; } }
[BindProperties]//让所有属性定义可绑定 public class HomeController : Controller { public IActionResult Index() { return View(); } //[BindProperty] [FromForm] public TestInfo? TestInfo { get; set; } public TestInfo? TestInfo01 { get; set; } //public IActionResult Deal00([FromForm]TestInfo testInfo) //{ // return RedirectToAction("Index"); //} //public IActionResult Deal00(TestInfo testInfo) //{ // return RedirectToAction("Index"); //} //public IActionResult Deal00() //{ // return RedirectToAction("Index"); //} //public IActionResult Deal00(string id,string name,[FromForm(Name ="Name")]string des) //{ // return RedirectToAction("Index"); //} public IActionResult Deal00([Bind("Id,Name,Des")] TestInfo testInfo) { return RedirectToAction("Index"); } }
@using ModelBindTest.Models; @model TestInfo @{ ViewData["Title"] = "Home Page"; } <div class="text-center"> <form asp-controller="Home" asp-action="Deal00" method="post"> <label>id</label> <input asp-for="Id" /> <label>name</label> <input asp-for="Name" /> @* <label>Des</label> <input asp-for="Des" />*@ <input type="submit" /> </form> </div>
//下面由于name的缘故,不能正确的进行模型绑定 <div class="text-center"> <form asp-controller="Home" asp-action="Deal00" method="post"> <label>id</label> <input asp-for="Id" name="T1" /> <label>name</label> <input asp-for="Name" name="T2"/> <label>Des</label> <input asp-for="Des" name="T3"/> <input type="submit" /> </form> </div>
客户端提交可能会遇到的坑
我们在从客户端提交数据的时候,常常会遇到绑定为空的情况,一般这种情况是由于键名称不对应造成的,比如在客户端
<Input asp-for="A.B">
如果B属性没有Display(Name="xx")注解,那么提交到服务端的表单或者请求的名称就是“A.B”
解决方案是,我们可以通过设置Display注解来设置,或者设置提交的名称,比如<Input asp-for="A.B" name="B">