【问题标题】:POST complex type with ignored property to OData Action with multiple parameters将具有忽略属性的复杂类型发布到具有多个参数的 OData 操作
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 这正是我所期待的。那么为什么它不起作用呢?当我使用密码发布用户实体时,ODataActionParameters 对象为空。即使我使用了非绑定参数。
    • 因为在 EdmModel 中用户没有密码属性
    • 我一定误解了你所说的。所以不可能让ODataActionParameters 正确映射User 与被忽略的Password 属性?
    • 忽略密码想获取是不对的,这个功能会帮助你在获取中删除密码并保留在模型odata.github.io/WebApi/#13-01-modelbound-attribute中吗?
    • 我阅读了链接,但没有找到任何与我的问题相关的内容。我也认为你误解了我的意图。我不想GET 密码。我想POST它。但我不能使用 User.Password 属性,因为当我在 json 有效负载中包含密码时,ODataActionParameters 是 null,因为它认为User 有效负载不正确。
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多