2011-11-21 140 views
4

说实话,我不知道该怎么称呼它或如何开始搜索它。ASP.NET MVC 3部分视图模板

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

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

这适用于主视图,但标签在使用模板时缺失。我错过了什么?

更新: Per @ K。鲍勃我做出改变局部视图:

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

对不起,不使该清晰。

+0

注意,参数'LabelFor'等人不是'Func',但一个'表达'。这是因为它可以通过反射来访问模型成员(也就是它的值,类型,名称和属性,例如'DisplayName')。当您将模型成员直接传递给partial时,您将更改该表达式,因此它不能再访问成员,并且只能访问成员的类型和值,因为它缺少模型的上下文。 – jpaugh

+0

您可能想要的是一个自定义模型联编程序或模型联编程序模板,尽管我没有这些经验。 – jpaugh

回答

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

或任何数据注解是显示名称。

+1

我决定不再做我以前想的事,但这可能是最好的解决方案。 –

1

你不需要ToString()你的财产。

@Html.LabelFor(m => m) 

修订

根据你想要做的,重用的意见,看看这比正常的一篇关于验证和局部视图的重用不再是我写的最多的答案ASP.NET MVC 3 - Model Validation。它非常详细。

+0

糟糕。错误的复制粘贴。 'ToString()'吹掉了页面,我忘了在发布之前删除它。这是固定在原来的职位。 –

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> 

然后它做什么,我想你想要做的(OBV它做了两次,但你可以从主视图中删除代码)。 虽然我不确定它会给你带来巨大的好处。也许我误解了一些东西。

+0

不,它没有。修复问题以反映更改 –

+0

@Mike - 当您调用此@@ Html.Partial(“_ BillField”,Model.Field)时,它只传递Field属性的值,而不是整个字段属性作为具有数据注释的属性附加到它(如果你明白我的意思) –

+0

@MikeWills - 我已经用一个工作示例更新了我的答案,所以忽略关于没有为此示例声明的模型的一点。如果您传递一个值(如Model.Field),则不需要该模型。 –

0

增加了一个新的答案,另一个没有回答一次澄清这个问题。 这篇文章LabelFor extension应该能够根据你的需求进行调整,但我认为这并不是为了创建你自己的扩展而重写更好。

,因为你需要使用m=>m.Field语法你需要稍微不同于你打算如何调用它。但我相信这应该做你所需要的,而不必使用局部视图。

如果您使用Model.Field语法,您将只发送字段属性的实际值,例如1.23作为小数,您需要使用m=>m.Field以获取更多的属性评估,以便您可以更改标签中的文字。