.NET Web API模型绑定前缀属性

时间:2017-08-31 09:15:20

标签: c# asp.net asp.net-web-api asp.net-web-api2

我有一个与此相似的视图模型和模型

public class SupplierViewModel
{
    public Supplier Supplier { get; set; } 
    //Select Lists and other non model properties
}

两个模特

public class Supplier
{
    public string Name { get; set; } 
    public Contact PrimaryContact { get; set; }
    public List<Contact> SecondaryContacts { get; set; }
}

public class Contact
{
    public string Name { get; set; } 
}

但在我看来,这些字段的前缀是类名,因此当我将它发送到Web API控制器时,它的格式如下:

{
    Supplier.Name: "test",
    Supplier.PrimaryContact.Name: "test",
    Supplier.SecondaryContacts: [
        { Name: "test" }
    ]
}

当我将其发送到我的控制器时

[System.Web.Http.Route("Suppliers/{idSupplier?}")]
public HttpResponseMessage SuppliersAddOrEdit(Supplier Supplier, int idSupplier = 0)

由于前缀显然没有反序列化,目前我在发送请求之前重新格式化它

{
    Name: "test",
    PrimaryContact: {Name: "test"},
    SecondaryContacts: [
        {
            Name: "test"
        }
    ]
}

然后它绑定好了,但是我很确定当我向ActionController发送数据时它甚至没有指定Bind [(Prefix)]就知道了,例如

  

PrimaryContact.Name:&#34; test&#34;

将进入PrimaryContact类。如何在Web API控制器中实现相同的结果?

编辑:根据Jon Susiak的回答,我想进一步澄清

如果我使用Controller而不是ApiController我的模型,因为它会绑定JSON中的数据与前缀,有没有办法在ApiController中实现相同的东西?

1 个答案:

答案 0 :(得分:0)

在您的视图中,您最初是在期望供应商对象的表单的POST上发送SupplierViewModel。

你可以做以下两件事之一:

a)将POST模型更改为SupplierViewModel

b)将初始模型更改为“供应商”,并将其他属性和列表放在ViewBag