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