У меня есть следующая конфигурация построителя OData. Определяет действие Create
с несколькими параметрами. Обратите внимание, что я игнорирую свойство Password
. Это важно позже.POST сложный тип с игнорируемым свойством OData Действие с несколькими параметрами
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
будет использовать объект 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 игнорировались свойства многосайтового действия параметра»
Благодарности
Update
Я не могу получить POST с Password
, чтобы работать больше. Уверен, что он работал раньше. Поэтому, пожалуйста, возьмите последнюю часть с солью. Квесто n все еще действует, хотя :)
Это было то, чего я ожидал. Так почему же это не работает? Когда я POST пользовательский объект с паролем, объект ODataActionParameters имеет значение NULL. Даже несмотря на то, что я использовал необязательный параметр. –
, потому что в EdmModel у пользователя нет пароля. –
Должно быть, я неправильно понял, что вы сказали. Таким образом, невозможно, чтобы 'ODataActionParameters' правильно отображал« Пользователь »с игнорированным свойством« Пароль »? –