如何在 asp.net 核心 3.1(或更高版本)MVC 中的控制器 post 操作中绑定复杂模型中的数据?

How do you bind data in a complex model in a controller post action in asp.net core 3.1 (or above) MVC?

如何在 asp.net 核心 3.1(或更高版本)MVC 中的控制器 post 操作中绑定复杂模型中的数据?

这只是一个示例模型,但要点是没有展平,也没有单独的视图模型。

给出这样的示例模型:

public class Business
{
   public int Id {get; set;}
   public string Name {get; set;}
   public string WebAddress {get; set;}
   public ContactDetails ContactInfo {get; set;}
   public Address AddressInfo {get; set;}
}

public class ContactDetails
{
   public string TelNo {get; set;}
   public string Mobile {get; set;}
}

public class Address 
{
   public string BuildingNo {get; set;}
   public string Street {get; set;}
   public string City {get; set;}
   public string Postcode {get; set;}
}

所有单独的属性都显示在视图中。

您如何将其具体绑定到控制器上的 post 方法?

如何绑定复杂的属性?

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create([Bind("Name,WebAddress")] DeliCakeBiz deliCakeBiz) <--- ???
{

}

如果你想绑定诸如“Id”、“Name”、“WebAddress”之类的属性,你可以直接使用[Bind("Id ,Name , WebAddress")],但是如果你想绑定一些特定的嵌套模型的属性,你可以添加[Bind("")] 在 class.

例如,如果我想绑定 NameStreet 属性,我可以使用此代码:

控制器

        [HttpPost]
        public async Task<ActionResult> ComplexModel([Bind("AddressInfo,Name")] Business bus)
        {
            //.......
            return View();        
        }

地址模型

    [Bind("Street")]
    public class Address
    {
        public string BuildingNo { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string Postcode { get; set; }
    }

查看

<form asp-action="ComplexModel">
    <div class="form-group">
        <label asp-for="Id"></label>
        <input type="text" asp-for="Id" />
    </div>
    <div class="form-group">
        <label asp-for="Name "></label>
        <input type="text" asp-for="Name " />
    </div>
    <div class="form-group">
        <label asp-for="WebAddress "></label>
        <input type="text" asp-for="WebAddress " />
    </div>
    <div class="form-group">
        <label asp-for="ContactInfo.TelNo"></label>
        <input type="text" asp-for="ContactInfo.TelNo" />
    </div>
    <div class="form-group">
        <label asp-for="ContactInfo.Mobile "></label>
        <input type="text" asp-for="ContactInfo.Mobile " />
    </div>
    <div class="form-group">
        <label asp-for="AddressInfo.BuildingNo"></label>
        <input type="text" asp-for="AddressInfo.BuildingNo" />
    </div>
    <div class="form-group">
        <label asp-for="AddressInfo.Street"></label>
        <input type="text" asp-for="AddressInfo.Street" />
    </div>
    <div class="form-group">
        <label asp-for="AddressInfo.City"></label>
        <input type="text" asp-for="AddressInfo.City " />
    </div>
    <div class="form-group">
        <label asp-for="AddressInfo.Postcode"></label>
        <input type="text" asp-for="AddressInfo.Postcode" />
    </div>
    <button type="submit">submit</button>
</form>

当我提交表单时,我只是绑定 StreetName 属性