ASP.NET MVC 3部分视图模板

时间:2011-11-21 17:25:03

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

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

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

<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>

很抱歉没有更清楚。

5 个答案:

答案 0 :(得分:2)

部分不需要告诉@model是什么,它会使用父@model,如果你取出部分中的@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>

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

答案 1 :(得分:1)

您无需ToString()您的财产。

@Html.LabelFor(m => m)

<强>已更新

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

答案 2 :(得分:1)

答案 3 :(得分:1)

我认为您可能应该对类型使用显示/编辑器模板,您的模型包括该类型的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;}
}

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

答案 4 :(得分:0)

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

您需要稍微改变一下,因为您需要使用m=>m.Field语法。但我确信这应该做你需要的,而不必使用局部视图。

如果您使用Model.Field语法,您将只发送Field属性的实际值,例如您的小数的1.23,您需要使用m=>m.Field获得的不仅仅是评估该属性,以便您可以更改标签中的文本。

相关问题