Представление сведений ASP.NET MVC с множеством отображаемых полей, но одним редактируемым полем

У меня есть представление, которое показывает один элемент со всеми его полями. Но я запутался, пытаясь понять, как разрешить обновление одного конкретного поля («Статус») из этого представления, не обязательно сначала переходя в совершенно другое «редактирование».

Как отправить http-публикацию в одно и то же действие (Подробности), но сохранить только поле «Статус», не сохраняя все остальные свойства, которые являются частью модели представления (только для отображения)? Нужна ли мне отдельная модель представления только для статуса? Новичок в ASP.NET MVC и запутался.

Посмотреть модель

public string FirstName { get; set; }
public string LastName { get; set; }
public string Birthdate{ get; set; }
public string Status { get; set; }
//etc.

Вид

<div>
    @Html.DisplayFor(model => model.FirstName)
    @Html.DisplayFor(model => model.LastName)
    @Html.DisplayFor(model => model.Birthdate)
    //etc.
</div>
<div>
    @TextBoxFor(model => model.Status)
    <button type="submit" value="Save Status" />
</div>

Контроллер

[HttpGet]
public ActionResult Details(int id)
{
    var person = personRepo.GetById(id);
    var vm = BuildPersonDetailsViewModel(person);
    return View(vm);
}

[HttpPost]
public ActionResult Details(PersonDetailsViewModel vm)
{
    var person = personRepo.GetById(vm.PersonID);
    person.Status = vm.Status;
    personRepo.Update(person);
}

person Jiveman    schedule 07.03.2015    source источник
comment
Выглядит хорошо. Какие у вас проблемы?   -  person    schedule 08.03.2015
comment
Я просто терялся между получением/публикацией, просмотром моделей, контроллером и т. д. Думаю, теперь я понял это. Во-первых, мне не хватало скрытого поля, в котором хранится идентификатор человека (которое на самом деле не нужно для представления сведений только для чтения, но необходимо для отправки чего-либо в базу данных. Ниже я опубликую более подробную информацию о своем решении.   -  person Jiveman    schedule 10.03.2015


Ответы (2)


Поэтому я решил эту проблему, убедившись, что поле первичного ключа PersonID включено в представление. Я не думал, что он мне нужен изначально, потому что он начинался как представление сведений только для чтения, и для отображения PersonID не требовалось. Но при обратной отправке данных мне нужно было добавить его как скрытое поле, чтобы его можно было передать контроллеру на HttpPost. Затем его можно использовать для поиска и обновления записи в базе данных.

Кроме того, я добавил в репозиторий еще один метод, позволяющий обновлять только поле «Статус», поскольку это единственное обновляемое значение. Если я использую приведенный выше пример кода, мое решение будет выглядеть примерно так:

Посмотреть модель

public int PersonID { get; set; }
public string Status { get; set; }
public string FirstName { get; set; }
//etc.

Вид

@Html.HiddenFor(model => model.PersonID)

@Html.DisplayFor(model => model.FirstName)
//etc. (all the display fields)

@TextBoxFor(model => model.Status)
<button type="submit" value="Save Status" />

Контроллер

[HttpPost]
public ActionResult Details(PersonDetailsViewModel vm)
{
    personRepo.UpdateStatus(vm.PersonID, vm.Status);
}
person Jiveman    schedule 10.03.2015

Вероятно, это не так, но, поскольку я не могу сказать из примера кода, есть ли у вас блок Html.BeginForm(){} вокруг модели, которую вы пытаетесь опубликовать? Также, возможно, попробуйте заменить тег <button> на <input type='submit' value='save status'/>.

person Marco    schedule 08.03.2015
comment
У меня есть Html.BeginForm, но у меня не было скрытого поля для идентификатора человека, которое является частью моего решения. - person Jiveman; 10.03.2015
comment
Я собирался спросить, были ли у вас все значения модели, которые вы хотели отправить в контроллер в представлении Razor, но я не видел идентификатора в модели представления, которую вы показали. Так сейчас работает? - person Marco; 10.03.2015
comment
да. Как только я начал думать об этом как о действии/представлении редактирования (хотя в основном с полями только для чтения/отображения и только с одним редактируемым полем), это стало более понятным. Я подходил к этому не с той стороны. - person Jiveman; 10.03.2015