【问题标题】:ASP.NET MVC Details view with many display fields but a single editable fieldASP.NET MVC 详细信息视图,其中包含许多显示字段,但只有一个可编辑字段
【发布时间】:2015-03-07 21:03:30
【问题描述】:

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

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

【问题讨论】:

  • 看起来不错。你有什么问题?
  • 我只是在获取/发布、视图模型、控制器等之间迷路了。我想我现在想通了。一方面,我缺少一个存储人员 ID 的隐藏字段(只读“详细信息”视图并不真正需要它,但将任何内容发回数据库需要它。我将发布有关我的解决方案的更多详细信息下面。

标签: asp.net-mvc entity-framework-6 repository-pattern asp.net-mvc-viewmodel


【解决方案1】:

所以我通过确保视图中包含主键字段 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);
}

【讨论】:

    【解决方案2】:

    这可能不是这种情况,但由于我无法从示例代码中看出,您尝试发布的模型周围是否有 Html.BeginForm(){} 块?也可以尝试将&lt;button&gt; 标签改为&lt;input type='submit' value='save status'/&gt;

    【讨论】:

    • 我确实有 Html.BeginForm,但我没有用于人员 ID 的隐藏字段,这是我的解决方案的一部分。
    • 我想问你是否有你想在 Razor 视图中发布到控制器的所有模型值,但我在你显示的视图模型中没有看到 id。那么它现在工作了吗?
    • 是的。一旦我开始将其视为更多的“编辑”操作/视图(尽管主要具有只读/显示字段并且只有一个可编辑字段),它开始变得更有意义。我是从错误的角度来的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多