在部分视图中使用公共属性

时间:2012-12-24 21:48:00

标签: asp.net-mvc partial-views

我正在创建一个部分视图来显示记录的审计标记......即。

  • CreatedOn
  • CreatedBy
  • ModifiedOn
  • ModifiedBy

我目前在我的所有视图模型中创建了一个新的子类,其中.AuditStamps包含这些属性,在我的控制器中填充它并将其传递给部分属性。

以下是我的一个视图模型的示例。注意AudiStamps子类

public class ItemViewModel
    {
        public Item Item { get; set; }
        public AuditStampsViewModel AuditStamps { get; set; }
    }

这是我的部分内容,起诉这个子类

@model OTIS.AppServ.Shared.AuditStampsViewModel

<hr />
<div class="twoColumn floatLeft">
    <div class="editor-field">
        <b>Created By:</b>
        @Html.DisplayFor(model => model.CreatedByName) on @Html.DisplayFor(model => model.CreatedOn)            
    </div>
</div>
<div class="twoColumn floatLeft">
    <div class="editor-field" style="text-align:right;">
        <b>Modified By:</b>
        @Html.DisplayFor(model => model.ModifiedByName) on @Html.DisplayFor(model => model.ModifiedOn)

    </div>
</div>

但是我想知道因为我的所有类都有这些常见属性,所以我真的需要通过添加和填充这个子类来完成。我唯一的原因是,因为我无法弄清楚如何在部分中声明一个通用模型...我希望如果我没有声明模型,部分将会起作用,但事实并非如此。我收到一个错误:

An expression tree may not contain a dynamic operation

我怎样才能做到这一点?看起来像接口只能使用类来解决这个问题,但不确定使用Partials是否适用相同的概念(即说明部分实现IAuditStamps接口???)

2 个答案:

答案 0 :(得分:2)

最后,我将partial的模型设置为一个接口,然后确保我的类也实现了这样的接口:

创建IAuditStamps接口

public interface IAuditStamps
    {
        int CreatedById { get; set; }
        string CreatedByName { get; set; }
        DateTime CreatedOn { get; set; }
        int ModifiedById { get; set; }
        string ModifiedByName { get; set; }
        DateTime ModifiedOn { get; set; }
    }

我的实现接口的类

public partial class Item : IEntityId, ICompanyId, IAuditStamps

ItemViewModel(使用上面的类Item)

public class ItemViewModel
    {
        public Item Item { get; set; }
    }

部分

@model OTIS.domain.IAuditStamps

<hr />
<div class="twoColumn floatLeft">
    <div class="editor-field">
        <b>Created By:</b>
        @Html.DisplayFor(model => model.CreatedByName) on @Html.DisplayFor(model => model.CreatedOn)            
    </div>
</div>
<div class="twoColumn floatLeft">
    <div class="editor-field" style="text-align:right;">
        <b>Modified By:</b>
        @Html.DisplayFor(model => model.ModifiedByName) on @Html.DisplayFor(model => model.ModifiedOn)

    </div>
</div>

调用部分:

@Html.Partial("_AuditStamps", Model.Item)

答案 1 :(得分:1)

这是所有视图模型可以继承的ViewModel基类的主要候选者:

public abstract class ViewModel 
{
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string ModifiedBy { get; set; }
}

public class ItemViewModel : ViewModel
{
    public Item Item { get; set; }
}

然后,您的部分可以将ViewModel作为其模型类型绑定到相关属性。任何需要partial的视图都应该使其模型继承自ViewModel基础,因此这些属性都可用于模型绑定。