Привязка не работает с TryUpdateModel, но то же самое работает с Bind - PullRequest
0 голосов
/ 28 августа 2018

У меня есть контроллер asp.net mvc, и я столкнулся со странной проблемой. Когда я пытался связать модель, используя Bind с элементами белого списка, она работала нормально, но когда я пытался связать, используя TryUpdateModel со свойствами include, то же самое не работало. Мой код в значительной степени стандартный.

public async Task<ActionResult> Index([Bind(include="firstname,lastname")]PersonModel model){
  .......
}

public async Task<ActionResult> Index(){
   var model = new PersonModel();
   var isBinding = TryUpdateModel(model,includeProperties:new[]{"firstName","lastname"})
  .......
}

Несмотря на то, что isBinding не имеет привязки, он имеет значение true. Может ли кто-нибудь предложить мне, почему TryUpdateModel не работает, но работает Bind. Спасибо

1 Ответ

0 голосов
/ 28 августа 2018

Причина, по которой TryUpdateModel() не обновляет состояние привязки вашей модели во втором действии Index, заключается в том, что вы можете привязать экземпляр PersonModel со значениями свойств firstname и lastname, по-прежнему установленными пустыми (или даже нулевое значение).

Вы можете использовать эту настройку, чтобы связать модель с TryUpdateModel:

public async Task<ActionResult> Index([Bind(Include = "firstname, lastname")] PersonModel model)
{
    if (TryUpdateModel(model))
    {
        // save changes with await
    }

    return View();
}

Или используя FormCollection в качестве альтернативы:

public async Task<ActionResult> Index(FormCollection form)
{
    var model = new PersonModel();
    if (TryUpdateModel(model, string.Empty, new [] { "firstname", "lastname" }, null, form))
    {
        // save changes with await
    }

    return View();
}

Тем не менее, я думаю, что лучше настроить модель представления, которая включает в себя все необходимые свойства и привязана оттуда, поскольку TryUpdateModel() метод имеет примечание по безопасности, на которое следует обратить внимание :

// Model
public class PersonViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

// Controller action
public async Task<ActionResult> Index(PersonViewModel model)
{
    var data = new PersonModel();
    data.FirstName = model.FirstName;
    data.LastName = model.LastName;

    // save changes with await

    return View();
}

Смежные вопросы:

Как мне отредактировать значение FormCollection, а затем использовать TryUpdateModel с отредактированной коллекцией?

Когда и почему вы используете TryUpdateModel в asp.net mvc 2?

Использование TryUpdateModel для сохранения объекта в Edit Post с FormCollection

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