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

本文关键字:模型 属性 隐藏 动态 视图 | 更新日期: 2023-09-27 18:24:44

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

@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编辑器模板中,如下所示:

 @Html.HiddenFor(m => Model)

这是隐藏编辑器,但不是隐藏标签"Id"。我不能使用这里提供的答案,如何从@Html.EditForModel()中排除字段,但使用Html.DisplayForModel(

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

有人能给出解决方案吗??

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

我认为应该创建一个自定义的Object.cshtml编辑器模板,如中所述

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

(注:我发现如何在mvc 4的web.config文件中添加程序集对System.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>
}