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

Asp.net mvc ASP.NET MVC详细信息视图,具有多个显示字段,但只有一个可编辑字段,asp.net-mvc,entity-framework-6,repository-pattern,asp.net-mvc-viewmodel,Asp.net Mvc,Entity Framework 6,Repository Pattern,Asp.net Mvc Viewmodel,我有一个视图,显示一个项目及其所有字段。但我在试图弄清楚如何允许一个特定字段(“状态”)从该视图更新时感到困惑,而不必首先进入另一个完整的“编辑”视图 如何在http上发布相同的操作(详细信息),但只保存“状态”字段,而不保存视图模型中的所有其他属性(仅用于显示)?我是否需要一个单独的视图模型来显示状态?刚接触ASP.NET MVC并感到困惑 视图模型 看法 情况可能不是这样,但由于我无法从示例代码中判断,您是否在试图发布的模型周围有Html.BeginForm(){}块?也可以尝试将标记改为,

我有一个视图,显示一个项目及其所有字段。但我在试图弄清楚如何允许一个特定字段(“状态”)从该视图更新时感到困惑,而不必首先进入另一个完整的“编辑”视图

如何在http上发布相同的操作(详细信息),但只保存“状态”字段,而不保存视图模型中的所有其他属性(仅用于显示)?我是否需要一个单独的视图模型来显示状态?刚接触ASP.NET MVC并感到困惑

视图模型 看法
情况可能不是这样,但由于我无法从示例代码中判断,您是否在试图发布的模型周围有
Html.BeginForm(){}
块?也可以尝试将
标记改为
,因此我通过确保视图中包含主键字段PersonID来解决这个问题。我原本认为我不需要它,因为它一开始是一个只读的细节视图,不需要显示PersonID。但是,在发回数据时,我需要将其添加为隐藏字段,以便将其传递给HttpPost上的控制器。然后,它可以用来定位和更新数据库中的记录

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

视图模型 看法
看起来不错。你有什么问题?我只是在get/post、视图模型、控制器等之间迷失了方向。我想我现在明白了。首先,我缺少了一个存储person ID的隐藏字段(只读“详细信息”实际上并不需要该字段)视图,但需要将任何内容发回数据库。我将在下面发布有关我的解决方案的更多详细信息。我有Html.BeginForm,但我没有为person ID设置隐藏字段,这是我的解决方案的一部分。我想问一下,在Razor视图中,您是否拥有所有要发布到控制器的模型值,但我没有在您显示的视图模型中看不到id。那么它现在工作了吗?是的。当我开始认为这更多是一个“编辑”操作/视图(虽然主要是只读/显示字段,只有一个可编辑字段)时,它开始变得更有意义。我从错误的角度来理解它。
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);
}
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);
}