【ASP.NET Core】模型绑定:重命名绑定字段

前面在写模型绑定相关的水文时,老周遗漏了一篇,特地补一下。

在 99.996 % 的情况下,咱们是不推荐自定义 Binder 的,毕竟那样做会增加开发工作量。其实内置的各种 Binder 基本能对付了。比较多见的情况应该是给字段另起一个名字。

举个示例,假设有下面这样一个类,它表示你家里的某台主机的配置。

    public class PC
    {
        public string? CPU { get; set; }
        public int MemorySize { get; set; }
        public string? BIOS { get; set; }
    }

然后,某控制器中有个 PostOne 方法,此方法接收 form 元素提交的数据,并绑定到 pc 参数。

        [Route("send")]
        public IActionResult PostOne(PC pc)
        {
            string s = $"CPU型号:{pc.CPU}\n内存大小:{pc.MemorySize}\nBIOS:{pc.BIOS}";
            s = "你的烂机:\n\n" + s;
            return Content(s);
        }

 

默认情况下,用于绑定的 form 内元素的 name 会与类的属性名字相同。

  <input name="CPU" type="text" />
  <input name="MemorySize" type="number" />
  ……

很多时候我们是想换个名字,比如改为 name="_cpu",name="_memsize"。这样一来,字段的名字就与类的属性名不匹配,需要在类定义上明确一下。

    public class PC
    {
        [ModelBinder(Name = "_cpu")]
        public string? CPU { get; set; }
        [ModelBinder(Name = "_memsize")]
        public int MemorySize { get; set; }
        [ModelBinder(Name = "_bios")]
        public string? BIOS { get; set; }
    }

ModelBinder 特性的 Name 属性就是用来给属性的绑定字段另起一个名字。

 

这时候,HTML 要改为:

<p>聊一下你的爱机</p>

<form method="post" action="/test/send">
    <table>
        <tr>
            <td>CPU:</td>
            <td><input name="_cpu" type="text"/></td>
        </tr>
        <tr>
            <td>内存大小:</td>
            <td><input name="_memsize" type="number"/></td>
        </tr>
        <tr>
            <td>BIOS:</td>
            <td><input name="_bios" type="text"/></td>
        </tr>
    </table>
    <button type="submit">提交</button>
</form>

 看看效果如何?

 

 

 

 

但是,有一点要注意,如果你使用了 form tag helper,那么,这个自己命名的字段名会有冲突。比如

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model TestApp.PC  //这个是模型类

<p>聊一下你的爱机</p>

<form method="post" asp-controller="BB" asp-action="PostOne">
    <table>
        <tr>
            <td>CPU:</td>
            <td><input asp-for="CPU"/></td>
        </tr>
        <tr>
            <td>内存大小:</td>
            <td><input asp-for="MemorySize"/></td>
        </tr>
        <tr>
            <td>BIOS:</td>
            <td><input asp-for="BIOS"/></td>
        </tr>
    </table>
    <button type="submit">提交</button>
</form>

要是用这种方法的话,那么在控制器类中无法读取到属性的值。目前老周还没找到解决方案,如果你答案,请告诉老周一声,也给大伙伴们做参考。

 

posted @ 2022-06-26 18:55  东邪独孤  阅读(262)  评论(0编辑  收藏  举报