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);
}
我有一个显示单个项目及其所有字段的视图。但是我很困惑,试图弄清楚如何允许一个特定字段 ("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);
}