POST复合类型,忽略属性到带有多个参数的OData Action

本文关键字:参数 Action OData 类型 复合 属性 POST | 更新日期: 2023-09-27 18:05:16

我有以下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的描述为:"添加一个新的非绑定参数"。EntityParameter没有描述。但我假设它是一个绑定参数。不管那是什么意思。(请解释)

后面会详细介绍这两个选项。

My User class

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
}

My request payload

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

当我发布上述请求parametersnull。但是,如果我POST它而没有忽略属性Password,那么它就会像预期的那样工作。

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

但事实并非如此:(

所以我对ParameterEntityParameter之间的差异感到困惑。有人能解释一下它们的用途吗?

等等,还有呢这就是我真正困惑的地方。

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

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

然后我可以做一个POST请求与Password属性包括。注意,它不再被包装在另一个对象中。

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

这很好。但是我需要额外的参数:(

我想真正的问题归结为:"我怎么能POST忽略属性到我的多参数动作?"

感谢

我不能得到POST与Password工作了。我肯定我之前让它工作了。所以请对最后一部分持保留态度。这个问题仍然有效:)

POST复合类型,忽略属性到带有多个参数的OData Action

第一个问题:EntityParameter也在添加一个非绑定实体类型参数。如果你添加一个绑定实体类型,这意味着你将这个动作绑定到一个实体或实体集,参见function: SetBindingParameter。

那么为什么使用Parameter函数可以获得密码属性呢?这是因为当您调用Parameter时,我们将在模型中的复杂类型和原始类型中搜索User类型,我们无法获得它,因此我们使用具有password属性的CLR类型为您的User类型构建复杂类型,并使用EntityParameter函数将在模型中获得不具有password属性的User实体类型。

这是一篇很老的文章。为什么不创建一个像

这样的请求模型类呢?
public class UserRequestModel 
{
   int number;
   User user;
}

之后定义这个复杂类型到你的OData模型。

之后像你提到的那样调用你的控制器方法;

[ODataRoute("Users/Create")]
public IHttpActionResult PostCreate(UserRequestModel userRequestModel)
{
    // omitted
}

这是我口袋里的两美分。

晚上好。