Модель Razor MVC теряет данные о действии Сохранить - PullRequest
11 голосов
/ 25 марта 2011

У меня есть 1 текстовое поле с использованием TextBoxFor, который содержит данные.

У меня есть идентификатор для модели и некоторые другие базовые данные, но они отображаются в виде меток непосредственно в представлении.

Когда я отправляю форму, данные о модели есть только в текстовом поле, все остальное равно нулю, включая Id. Это означает, что он не будет сохранен в базе данных.

Что может привести к тому, что все поля будут равны нулю, кроме текстового поля?

Ответы [ 3 ]

16 голосов
/ 25 марта 2011

Так работает веб, только элементы формы отправляются вместе с формой, а метки не являются элементами формы.

Обычно здесь происходит следующее:

  1. Визуализацияскрытое поле (Html.Hidden / Html.HiddenFor), содержащее идентификатор вместе с текстовыми полями
  2. Примите изменения в действии вашего контроллера (в качестве параметров или объекта)
  3. Увлажните экземпляробъект, представленный Id из вашего хранилища / базы данных
  4. Применение изменений к гидратированному экземпляру
  5. Проверка состояния объекта и обновление вашего хранилища / базы данных (или того, что вы планировали делать сit)

Поскольку класс публикуемых данных часто является «недействительным» из-за его отсутствующих свойств (например, помеченных как [Required]), очень распространено создание нового класса, который имеет только свойствабудучи измененным (называется «модель команды»).Этот класс может иметь свои собственные свойства проверки и, следовательно, не портить проверку формы.

6 голосов
/ 25 марта 2011

Только входы отправляются обратно на сервер.Если вы хотите, чтобы модель заполнялась на основе данных на странице, они должны быть во входных данных (или в части URL).Данные в элементах метки не будут размещены на сервере с формой (это стандартное поведение формы HTML).Обычно вы используете скрытые поля для публикации нередактируемых данных модели или просто ссылаетесь на идентификатор модели и заново заполняете базу данных, обновляя редактируемые свойства (как показано ниже).

Пример:

 @(using Html.BeginForm( new { id = Model.ID } ))
 {
       <p>
           <label>Fixed Property:</label>
           @Model.SomeFixedProperty
       </p>
       <p>
          @Html.LabelFor( m => m.EditableProperty )
          @Html.TextBoxFor( m => m.EditableProperty )
       </p>
}

Контроллер

[HttpPost]
public ActionResult Foo( int id, string editableProperty )
{
    var model = repo.GetById( id );
    model.EditableProperty = editableProperty;
    repo.Save();
    return View( model );
}
0 голосов
/ 19 ноября 2015

Хотя я согласен с @RichardSzalay, еще один способ - пометить неизмененные свойства как неизмененные.

Допустим, у вас есть модель со следующими свойствами: Id, Name, Email. И вы не хотите менять Email.

public ActionResult ChangeName([Bind(Include="Id,Name")] User model)
{
    // ...
    db.Entry(model).State = EntityState.Modified;
    db.Entry(model).Property(m => m.Email).IsModified = false;
    db.SaveChanges();
    // ...
}

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

...