ASP.NET MVC 详细信息视图具有许多显示字段但只有一个可编辑字段

ASP.NET MVC Details view with many display fields but a single editable field

我有一个显示单个项目及其所有字段的视图。但是我很困惑,试图弄清楚如何允许一个特定字段 ("Status") 从该视图更新,而不必先进入整个其他 "edit" 视图。

我如何 http-post 执行相同的操作(详细信息)但只保存 "Status" 字段,而不保存属于视图模型的所有其他属性(用于显示只要)?我是否需要一个单独的视图模型来处理状态? 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);
}

情况可能并非如此,但由于我无法从示例代码中看出,您是否在您尝试 post 的模型周围设置了 Html.BeginForm(){} 块?也可以尝试将 <button> 标签更改为 <input type='submit' value='save status'/> 而不是

所以我通过确保视图中包含主键字段 PersonID 来解决这个问题。我不认为我最初需要它,因为它开始时是一个只读的详细信息视图,并且不需要显示 PersonID。但是当回发数据时,我需要将其添加为隐藏字段,以便它可以传递给 HttpPost 上的控制器。然后可以用来定位和更新数据库中的记录。

此外,我在存储库中添加了另一种方法,以允许仅更新 "Status" 字段,因为这是唯一被更新的值。如果我使用上面的示例代码,我的解决方案如下所示:

查看模型

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);
}