Построение объекта параметра действия из данных XHR-запроса MVC3 - PullRequest
0 голосов
/ 27 декабря 2011

У меня есть это действие в моем приложении RESTful на MVC3:

[HttpPut]
public void Rest(ViewModel view_model, int id)
{
    //doing something with view_model
}

Где ViewModel class - это класс для передачи данных в / из клиентского Javascript (я не хочу передавать чистые сущности БД):

public class ViewModel
{
    public ViewModel()  //parameterless constructor, needed for accepting as parameter in action
    {
    }

    public ViewModel(Model m)
    {
        id = m.ID;
        Title = m.Title;
    }

    public int? id { get; set; }

    private string _title;
    public string Title
    {
        get
        {
            if (String.IsNullOrWhiteSpace(_title)) throw new Exception("Empty field");
            return _title;
        }
        set
        {
            _title = value;
        }
    }
}

НО, когда я делаю запрос PUT с этими данными:

{ "id" :    7, "Title" : "Hello world!" }

Я получаю исключение "Пустое поле". Похоже, что-то пытается получить Свойство заголовка, даже до было установлено с входящим "Hello Мир!" данные. Почему?

И где я могу получить некоторую информацию о том, как работает вся эта операция, то есть поиск объекта ViewModel, указанного в качестве параметра действия, в реальном XHR-запросе.

Спасибо за ваши мысли.

1 Ответ

1 голос
/ 27 декабря 2011

Похоже, что что-то пытается получить свойство Title, даже до того был установлен с входящим "Привет мир!" данные. Почему?

Это переплет модели по умолчанию. А точнее, метод BindProperty . Этот метод вызывается во время привязки и использует отражение для вызова метода получения. Поскольку механизм связывания модели возвращается к графу иерархии объектов, ему сначала необходимо получить значение свойства, создать контекст привязки и метаданные модели для каждого свойства, а затем вызвать метод SetProperty.

Если вы не хотите, чтобы свойство title было пустым, используйте механизмы проверки и автоматически реализованные свойства:

[Required]
public string Title { get; set; }

, а затем в своем действии RESTful проверьте, если ModelState.IsValid. Гораздо проще и MVCish:

[HttpPut]
public ActionResult Rest(ViewModel view_model, int id)
{
    if (!ModelState.IsValid)
    {
        ...
    }

    // doing something with view_model
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...