【发布时间】:2016-09-02 12:47:24
【问题描述】:
我有以下 OData 构建器配置。它定义了一个带有一些参数的动作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 没有描述。但我认为它是一个绑定参数。不管什么意思。 (请解释)
稍后会详细介绍这两个选择。
我的用户类
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" }
这很好。但我需要额外的参数:(
我想真正的问题归结为:“如何将忽略的属性发布到我的多参数操作?”
谢谢
更新
我无法让Password 的 POST 工作了。我敢肯定我早点工作过。所以请用一粒盐来接受最后一部分。
这个问题仍然有效:)
【问题讨论】:
标签: c# asp.net-web-api odata asp.net-web-api-odata