我有以下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" }
}
当我发布上述请求时,parameters
为null
。但是,如果我在没有被忽略的属性Password
的情况下发布它,那么它将按预期工作。
这是我假设使用EntityParameter
将使用OData构建器定义的User
实体的地方。没有Password
属性的那个。
Parameter
将使用实际的User
类型,包括Password
属性。允许我做上述请求。
但事实并非如此:(
所以我对Parameter
和EntityParameter
之间的区别感到困惑。有人可以解释他们的预期用途吗?
但请坚持下去。 这是我真的很困惑的地方。
如果我将操作的参数数量减少到只有复杂的User
类型,并将我的控制器操作更改为:
[ODataRoute("Users/Create")]
public IHttpActionResult PostCreate(User user)
{
// omitted
}
然后我可以执行包含Password
属性的POST请求。请注意,它不再包含在另一个对象中。
{ "FirstName": "foo", "LastName": "bar", "Password": "123" }
哪个好。但我需要额外的参数:(
我想真正的问题归结为:&#34;如何将忽略的属性POST到我的多参数操作?&#34;
由于
更新
我无法通过Password
获取POST功能。我确定我早点工作了。所以请在最后一部分吃一粒盐。
这个问题仍然有效:)
答案 0 :(得分:1)
第一个问题:EntityParameter还添加了一个非绑定实体类型参数。如果添加绑定实体类型,则表示将此操作绑定到实体或实体集,请参阅function:SetBindingParameter。
那么为什么使用Parameter
函数可以获取密码属性?这是因为当您致电Parameter
时,我们会在模型中搜索复杂类型和原始类型的User
类型,但我们无法获取它,因此我们为您的{{1}构建了一个复杂类型使用具有User
属性的CLR类型键入,并使用password
函数将在模型中获得EntityParameter
实体类型,而User
实体类型不具有password
属性。