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" }
}
当我发布上述请求parameters
是null
。但是,如果我POST它而没有忽略属性Password
,那么它就会像预期的那样工作。
在这里,我假设使用EntityParameter
将使用OData构建器定义的User
实体。没有Password
属性的那个。Parameter
将使用实际的User
类型,包括Password
属性。允许我做以上的请求。
但事实并非如此:(
所以我对Parameter
和EntityParameter
之间的差异感到困惑。有人能解释一下它们的用途吗?
等等,还有呢这就是我真正困惑的地方。
如果我减少我的动作参数的数量,只有复杂的User
类型,并改变我的控制器动作为:
[ODataRoute("Users/Create")]
public IHttpActionResult PostCreate(User user)
{
// omitted
}
然后我可以做一个POST请求与Password
属性包括。注意,它不再被包装在另一个对象中。
{ "FirstName": "foo", "LastName": "bar", "Password": "123" }
这很好。但是我需要额外的参数:(
我想真正的问题归结为:"我怎么能POST忽略属性到我的多参数动作?"
感谢我不能得到POST与Password
工作了。我肯定我之前让它工作了。所以请对最后一部分持保留态度。这个问题仍然有效:)
第一个问题: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
}
这是我口袋里的两美分。
晚上好。