2016-09-02 4 views
1

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

ответ

1

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

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

+0

Это было то, чего я ожидал. Так почему же это не работает? Когда я POST пользовательский объект с паролем, объект ODataActionParameters имеет значение NULL. Даже несмотря на то, что я использовал необязательный параметр. –

+0

, потому что в EdmModel у пользователя нет пароля. –

+0

Должно быть, я неправильно понял, что вы сказали. Таким образом, невозможно, чтобы 'ODataActionParameters' правильно отображал« Пользователь »с игнорированным свойством« Пароль »? –