将具有ignore属性的复杂类型POST到具有多个参数的OData Action

时间:2016-09-02 12:47:25

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

我有以下OData构建器配置。其中定义了一个带有一些参数的Action Create。请注意,我忽略了属性Password。这很重要。

var userEntitySetName = nameof(UsersController).Replace("Controller", string.Empty);
var users = builder.EntitySet<User>(userEntitySetName);
users.EntityType.HasKey(x => x.Id);
users.EntityType.Ignore(x => x.Password);

var userCreateAction = users.EntityType.Collection.Action("Create").ReturnsFromEntitySet<User>(userEntitySetName);
userCreateAction.Parameter<int>("number");

然后我可以选择

userCreateAction.EntityParameter<User>("user");

或者

userCreateAction.Parameter<User>("user");

Parameter的说明:&#34;添加新的非约束参数&#34;。 EntityParameter没有说明。但我认为它是一个绑定参数。不管它是什么意思。 (请解释)

稍后会更多关于这两个选择。

我的用户类

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }
    public string Email { get; set; }
    public string Password { get; set; } // remember this is ignored
}

我的控制器操作

[ODataRoute("Users/Create")]
public IHttpActionResult PostCreate(ODataActionParameters parameters)
{
    // omitted
}

我的请求有效负载

{
    "number": 1,
    "user":{ "FirstName": "foo", "LastName": "bar", "Password": "123" }
}

当我发布上述请求时,parametersnull。但是,如果我在没有被忽略的属性Password的情况下发布它,那么它将按预期工作。

这是我假设使用EntityParameter将使用OData构建器定义的User实体的地方。没有Password属性的那个。 Parameter将使用实际的User类型,包括Password属性。允许我做上述请求。

但事实并非如此:(

所以我对ParameterEntityParameter之间的区别感到困惑。有人可以解释他们的预期用途吗?

但请坚持下去。 这是我真的很困惑的地方。

如果我将操作的参数数量减少到只有复杂的User类型,并将我的控制器操作更改为:

[ODataRoute("Users/Create")]
public IHttpActionResult PostCreate(User user)
{
    // omitted
}

然后我可以执行包含Password属性的POST请求。请注意,它不再包含在另一个对象中。

{ "FirstName": "foo", "LastName": "bar", "Password": "123" }

哪个好。但我需要额外的参数:(

我想真正的问题归结为:&#34;如何将忽略的属性POST到我的多参数操作?&#34;

由于

更新

我无法通过Password获取POST功能。我确定我早点工作了。所以请在最后一部分吃一粒盐。 这个问题仍然有效:)

1 个答案:

答案 0 :(得分:1)

第一个问题:EntityParameter还添加了一个非绑定实体类型参数。如果添加绑定实体类型,则表示将此操作绑定到实体或实体集,请参阅function:SetBindingParameter。

那么为什么使用Parameter函数可以获取密码属性?这是因为当您致电Parameter时,我们会在模型中搜索复杂类型和原始类型的User类型,但我们无法获取它,因此我们为您的{{1}构建了一个复杂类型使用具有User属性的CLR类型键入,并使用password函数将在模型中获得EntityParameter实体类型,而User实体类型不具有password属性。