почему исключение свойств модели при обновлении с TryUpdateModel не работает без ModelState.Remove - PullRequest
0 голосов
/ 18 октября 2011

Я пытаюсь обновить модель, исключив некоторые свойства с указанным ниже кодом на моем контроллере. Действие:

[HttpPost, ValidateAntiForgeryToken, ActionName("Edit")]
public ActionResult Edit_post(Board board, int id) {

    var model = _boardrepository.GetSingle(id);

    #region _check if exists

    if (model == null)
        return HttpNotFound();

    #endregion

    if (TryUpdateModel<Board>(model, "", null, new string[] { "BoardID", "BoardGUID", "BoardAbbr" })) { 

        try {

            _boardrepository.Edit(model);
            _boardrepository.Save();

            return RedirectToAction("details", new { id = id });

        } catch (Exception ex) {

            #region Log the error
            ex.RaiseElmahNotification("Error while trying to update a destination.");
            #endregion

            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, inform your system administrator.");
        }

    }

    return View(board);
}

Когда я пытаюсь обновить мою модель, она перенаправляет меня в окно редактирования и выдает ошибкусообщение о том, что поле BoardAbbr является обязательным, что вполне законно, если мне нужно обновить поле BoardAbbr.Но, как вы можете видеть, я исключаю некоторые поля с кодом ниже, и BoardAbbr является одним из них:

if (TryUpdateModel<Board>(model, "", null, new string[] { "BoardID", "BoardGUID", "BoardAbbr" }))

Затем я помещаю код ниже перед методом TryUpdateModel, он работает как шарм:

ModelState.Remove("BoardAbbr");

Что меня здесь беспокоит, так это то, что либо я делаю что-то не так, либо что-то не так было встроено в фреймворк.Могу поспорить, что первая проблема здесь.

почему не исключает свойства модели при обновлении с TryUpdateModel без ModelState.Remove?

Если честно, я не так много в этом разбиралсяи прямо сюда, чтобы кричать вам этот вопрос, ребята.

1 Ответ

2 голосов
/ 18 октября 2011

Ваша модель Board, вероятно, имеет свойство BoardAbbr.Сообщение приходит от проверки опубликованной модели (в данном случае Board) и не имеет ничего общего с TryUpdateModel.Таким образом, если вы удалите свойство в вашей модели, сообщение исчезнет.

Вы можете увидеть, что происходит, если вы поместите свой if(TryUpdateModel... внутрь, если это так:

if(!ModelState.IsValid) {
    if (TryUpdateModel<Board>(model, "", null, new string[] { "BoardID", "BoardGUID", "BoardAbbr" })) { 
  .....
    }
}

РЕДАКТИРОВАТЬ

В соответствии с вашим комментарием: исключение свойства с атрибутом Bind будет работать:

public ActionResult Edit_post([Bind(Exclude="BoardAbbr")] Board board, int id) {

Но вы также можете убедиться, что в этом значении нетможет быть привязан к свойству, связыватель не будет генерировать сообщение для свойств без значений формы.

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