Сложный тип POST с игнорируемым свойством для действия OData с несколькими параметрами

У меня есть следующая конфигурация построителя 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");

Or

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 будет использоваться сущность User, определенная компоновщиком OData. Тот, у которого нет свойства 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 с Password. Я уверен, что у меня это работало раньше. Поэтому, пожалуйста, отнеситесь к последней части с недоверием. Хотя вопрос актуален :)


person Snæbjørn    schedule 02.09.2016    source источник


Ответы (1)


Первый вопрос: EntityParameter также добавляет необязательный параметр типа объекта. Если вы добавляете тип сущности привязки, это означает, что вы привязываете это действие к сущности или набору сущностей, см. функцию: SetBindingParameter.

Итак, почему вы используете функцию Parameter, чтобы получить свойство пароля? Это связано с тем, что когда вы вызываете Parameter, мы будем искать тип User в сложных типах и примитивных типах в вашей модели, и мы не можем его получить, поэтому мы создаем сложный тип для вашего типа User, используя тип CLR, который имеет свойство password, и используем Функция EntityParameter получит тип объекта User в модели, не имеющей свойства password.

person Fan Ouyang    schedule 05.09.2016
comment
Этого я и ожидал. Так почему же это не работает? Когда я отправляю объект пользователя с паролем, объект ODataActionParameters имеет значение null. Хотя я использовал необязательный параметр. - person Snæbjørn; 05.09.2016
comment
потому что в EdmModel у пользователя нет свойства пароля - person Fan Ouyang; 06.09.2016
comment
Должно быть, я неправильно понял то, что вы сказали. Значит, невозможно заставить ODataActionParameters правильно сопоставить User с игнорируемым свойством Password? - person Snæbjørn; 08.09.2016
comment
Не правильно игнорировать пароль и хотеть его получить, поможет ли эта функция удалить пароль в Get и оставить его в модели odata.github.io/WebApi/#13-01-modelbound-attribute? - person Fan Ouyang; 09.09.2016
comment
Я прочитал ссылку, но не нашел ничего похожего на мою проблему. Также я думаю, что вы неправильно поняли мое намерение. Я не хочу GET пароль. Я хочу POST это. Но я не могу использовать свойство User.Password, потому что, когда я включаю пароль в полезную нагрузку json, ODataActionParameters становится null, потому что он считает, что полезная нагрузка User неверна. - person Snæbjørn; 09.09.2016