在动态视图中隐藏模型的属性

时间:2013-07-25 05:42:36

标签: c# asp.net-mvc-4

我有一个动态视图,这将显示已传递给它的任何模型。

@model dynamic

@using (Html.BeginForm("Edit", null, FormMethod.Post, new { id="FrmIndex" }))
{
@Html.ValidationSummary(true);
@Html.EditorForModel()

 <input type="submit" value="Edit" />
}

假设我的一个模型是PartyRole

public partial class PartyRole
{
    [Key, Display(Name = "Id"]
    [UIHint("Hidden")]
public int PartyRoleId { get; set; }

    [UIHint("TextBox")]
    public string Title { get; set; }

}

我不想在编辑模式下显示Id,所以我将它隐藏在Hidden.cshtml editorfortemplate中,如下所示:

 @Html.HiddenFor(m => Model)

这是隐藏编辑器,但不是标签“Id”。 我无法使用此处提供的答案How to exclude a field from @Html.EditForModel() but have it show using Html.DisplayForModel()

因为IMetadataAware需要System.Web.Mvc命名空间,我无法在拥有poco模型类的Biz项目中添加它。 我也不能使用[HiddenInput(DisplayValue = false)],因为这也是web.mvc的派对

有人可以提供解决方案吗?

1 个答案:

答案 0 :(得分:2)

我认为要做的是创建自定义Object.cshtml编辑器模板,如

中所述

http://www.headcrash.us/blog/2011/09/custom-display-and-editor-templates-with-asp-net-mvc-3-razor/

(nb。我发现How to add assembly in web.config file of mvc 4System.Data.EntityState引用有帮助。)

在该模板中,您可以输入适当的代码来隐藏标签。以下是一个愚蠢的例子 - 我想我可能会尝试选择一个自定义属性,但显然这会涉及DataAnnotationsModelMetadataProvider的重载。

if (prop.HideSurroundingHtml)
{
    @Html.Editor(prop.PropertyName)
}
else if (prop.PropertyName == "PartyRoleId")
{
    <div></div>   
}
else if (!string.IsNullOrEmpty(Html.Label(prop.PropertyName).ToHtmlString()))
{
    <div class="editor-label">@Html.Label(prop.PropertyName)</div>
}