【问题标题】:ASP.NET MVC 3 Partial View TemplateASP.NET MVC 3 部分视图模板
【发布时间】:2012-01-03 04:34:23
【问题描述】:

说实话,我不知道该怎么称呼它或如何开始搜索它。

我有一个标准布局的显示页面。

<div>
    <label for="field">Field Name:</label>
    @Model.Field
</div>

在尝试使更改更友好的同时,我想制作一个模板,而不是用上面的代码输入每个字段。

我使用以下内容创建了一个局部视图:

@model System.Object
<div>
    @Html.LabelFor(m => m)
    @Html.DisplayFor(m => m)
</div>

在我看来,我添加了以下内容:

@Html.Partial("_BillField", Model.Field)

然后该模型具有如下描述:

public ModelName {
    [Display(Name="Field Description")]
    public decimal Field { get; set; }
}

这在主视图上有效,但在使用模板时标签丢失。我错过了什么?

更新:每@K。 Bob 我对局部视图进行了更改:

<div>
    @Html.LabelFor(m => m)
    @Html.DisplayFor(m => m)
</div>

更新 2:为了清楚我想要什么。

最后,我希望能够做到:

@Html.Partial("_BillField", Model.Field1)
@Html.Partial("_BillField", Model.Field2)
@Html.Partial("_BillField", Model.Field3)

并且有等价于:

<div>
    <label for="field1">Field 1 Name:</label>
    @Model.Field1
</div>
<div>
    <label for="field2">Field 2 Name:</label>
    @Model.Field2
</div>
<div>
    <label for="field3">Field 3 Name:</label>
    @Model.Field3
</div>

很抱歉没有说得更清楚。

【问题讨论】:

  • 请注意,LabelFor 等人的参数不是Func,而是Expression&lt;Func&gt;。这是因为它可以使用它通过反射访问模型成员(即它的值、类型、名称和属性,例如DisplayName)。当您将模型成员直接传递给部分时,您正在更改该表达式,因此它不能再就地访问该成员,并且只能访问该成员的类型和值,因为它缺少模型的上下文.
  • 您可能想要的是自定义模型活页夹或模型活页夹模板,尽管我没有这方面的经验。

标签: asp.net-mvc-3 razor partial-views


【解决方案1】:

partial不需要告诉@model是什么,它会使用父@model,如果你取出partial中的@model有帮助吗?

如果我有这个作为视图......

@model MyApp.Models.ModelName
@{
    ViewBag.Title = "Test";
}

<h2>Test</h2>
<div>
           <div class="editor-label">
                @Html.LabelFor(m => m.Field)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Field)
                @Html.ValidationMessageFor(m => m.Field)
            </div>
</div>
@Html.Partial("_partial", Model) @*note I pass the whole model*@

而这作为部分......

@model MyApp.Models.ModelName
<div>
              <div class="editor-label">
                @Html.LabelFor(m => m.Field)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Field)
                @Html.ValidationMessageFor(m => m.Field)
            </div>
</div>

然后它会做我认为你想做的事情(obv。它做了两次,但你可以从主视图中删除代码)。 我不确定它会给你带来巨大的好处。也许我误解了什么。

【讨论】:

  • 不,它没有。解决问题以反映变化
  • @Mike - 当您调用此@Html.Partial("_BillField", Model.Field) 时,它仅传递 Field 属性的值,而不是整个字段属性作为附加了数据注释的属性(如果您明白我的意思)
  • @MikeWills - 我已经用一个工作示例更新了我的答案,所以请忽略关于没有为此示例声明模型的部分。如果您要传递一个值(如 Model.Field),则不需要模型。
  • 但我想要一个可以重复使用的通用东西。所以我可以做@Html.Partial("_BillField", Model.Field)@Html.Partial("_BillField", Model.Field2)@Html.Partial("_BillField", Model.Field3)等等。我也会补充问题。
  • @MikeWills - 您正在寻找一个 HTMLHelper,它生成的 HTML 是其他 HTMLHelper 的集合,对吗?你给它模型,而不必编写三个“块”帮助程序代码,你只写一个?如果这是您要找的,我会问一个新的问题。
【解决方案2】:

我认为您可能应该对类型使用显示/编辑器模板,您的模型包含该类型的 3 个字段。

@Html.Partial("_BillField", Model.Field1)
@Html.Partial("_BillField", Model.Field2)
@Html.Partial("_BillField", Model.Field3)

为类型定义模板而不是部分视图可能更有效。有关详细比较,请参阅ASP.NET MVC 3 - Partial vs Display Template vs Editor Template

在这种情况下,您的视图看起来更像:

@Html.DisplayFor(model => model.Field1)
@Html.DisplayFor(model => model.Field2)
@Html.DisplayFor(model => model.Field3)

你的模型是:

public class model
{
   [DisplayName("Field1")]
   public ComplexType Field1 {get;set;}
   [DisplayName("Field2")]
   public ComplexType Field2 {get;set;}
   [DisplayName("Field3")]
   public ComplexType Field3 {get;set;}
}

或者显示名称的任何数据注释。

【讨论】:

  • 我决定不再按照我的想法去做,但这可能是最好的解决方案。
【解决方案3】:
【解决方案4】:

您无需ToString()您的财产。

@Html.LabelFor(m => m)

更新

根据您想要做的事情,重用视图,看看这篇比普通帖子更长的关于重用验证和部分视图的帖子,我写了ASP.NET MVC 3 - Model Validation 的答案。非常详细。

【讨论】:

  • 糟糕。不好的复制粘贴。 ToString() 炸毁了页面,我忘记在发布之前将其删除。这是在原始帖子中修复的。
【解决方案5】:

添加了一个新答案,因为另一个人在澄清后没有回答问题。 我认为这篇帖子LabelFor extension 应该能够根据您的需要进行调整,而不是更好地覆盖以创建您自己的扩展。

由于您需要使用m=&gt;m.Field 语法,因此您需要调用它与您建议的方式略有不同。但我确信这应该可以满足您的需要,而无需使用局部视图。

如果您使用 Model.Field 语法,您只会发送 Field 属性的实际值,例如 1.23 表示您的小数,您需要使用 m=&gt;m.Field 来获得更多的属性,以便获得更多信息您可以更改标签中的文本。

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多