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">

posted @ 2022-03-30 17:40  小辉歌  阅读(265)  评论(0编辑  收藏  举报