【问题标题】:Reuse MVC View for both Display of Data and Editing of Data重用 MVC 视图来显示数据和编辑数据
【发布时间】:2012-01-21 11:13:06
【问题描述】:

我有两个 MVC 视图...一个用于显示详细信息,一个用于编辑值。它们使用几乎相同的模板,只是在切换到编辑器视图时将 DisplayFor 更改为 EditorFor。如何在视图中重用我的基本布局结构,以便如果我需要更改基本布局,我只需要在一个位置而不是多个视图中进行?

这是显示视图中使用的表格示例:

<table>
  <tr>
    <td class="label">First Name:</td>
    <td class="field">@Html.DisplayFor(x => Model.FirstName)</td>
  </tr>
  <tr>
    <td class="label">Last Name:</td>
    <td class="field">@Html.DisplayFor(x => Model.LastName)</td>
  </tr>
  <tr>
    <td class="label">Email:</td>
    <td class="field">@Html.DisplayFor(x => Model.Email)</td>
  </tr>
</table>

【问题讨论】:

  • 您可能需要考虑使用 MVC 的视图模板。这将允许您拥有一个视图来处理所有对象编辑器,以及另一个视图来处理所有对象显示器,这将比每个对象类型仅使用一个视图更好地重用代码。

标签: asp.net-mvc asp.net-mvc-views


【解决方案1】:

您可以在视图模型中添加 Mode 属性:

public bool IsInEditMode { get; set; }

然后,您的控制器可以使用相同的视图和模型,只需相应地设置此属性。你的视图最终会是这样的:

<table>
  <tr>
    <td class="label">First Name:</td>
    <td class="field">
        @if (!Model.IsInEditMode)
        {
            @Html.DisplayFor(x => Model.FirstName)
        }
        else
        {
            (render EditorFor plus any validation helpers)
        }
    </td>
  </tr>
  ...etc...
</table>

【讨论】:

  • 我希望有一些更清洁的东西(单线或某种包装方法),但它确实有效。感谢您的信息!
【解决方案2】:

或者你可以使用更清洁的东西来完成这项工作,比如 Razor helper

public bool IsInEditMode { get; set; }

@helper EditorFor(System.Linq.Expressions.Expression<Func<ViewModel, string>> exp)
{   
    @((Model.IsInEditMode )  ? @Html.EditorFor(exp) : @Html.DisplayFor(exp))
}

【讨论】:

  • 这对另一种情况也有帮助。我没有将 View 和 Edit 结合起来,但我的 Edit 视图有很多基于状态的限制(取决于状态,某些字段可能无法编辑),这很好用。
【解决方案3】:

拥有一个检查实体 ID 的动态视图。剃须刀真棒!如果为 0 或 null 它是一个新实体,否则您处于编辑模式。

剃刀条件!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2011-10-24
    相关资源
    最近更新 更多