1

我们使用 DisplayForModel() 以网格格式显示模型属性。

我只想知道有什么方法可以定义元数据属性的顺序。

例如:

当前显示:Party、PartyRole、Id、Title FromDate、ThruDate

所需显示:标题、派对、派对角色、FromDate、ThruDate、Id

有没有可能???

显示模板 - object.cshtml

@functions
{
bool ShouldShow(ModelMetadata metadata)
{
    return metadata.ShowForDisplay
        && metadata.ModelType != typeof(System.Data.EntityState)
        && !metadata.IsComplexType
        && !ViewData.TemplateInfo.Visited(metadata);
}
}
<table>
<tr>
    @if (TempData["header"] == null)
    {
        foreach (var property in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm)))
        {
            if (property.DisplayName != "Id")
            { 
        <th>
            @property.GetDisplayName()
        </th>
            }
        }
        TempData["header"] = "true";
    }
</tr>
<tr>
    @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm)))
    {
        if (prop.DisplayName == "Id")
        {
             <td>@Html.ActionLink("Edit", "Edit", new { id = @Html.Display(prop.PropertyName)  }) </td>
        }
        else
        { 
           <td>@Html.Display(prop.PropertyName)</td>
        }
    }
    </tr>
</table>

网格.cshtml

@model IEnumerable<object>
<div class="grid">
@Html.DisplayForModel()

</div>
<div id="my-dialog"></div>

提前非常感谢..

4

1 回答 1

2

如果您使用的是默认值DataAnnotationsModelMetadataProvider,则可以在模型的属性上使用DisplayAttribute'Order属性(此处为 info),即(猜测您的 ViewModel):

public class ViewModel
{
    [Display(Order = 1)]
    public string Party { get; set; }

    [Display(Order = 2)]
    public SomeRole PartyRole { get; set; }

    [Display(Order = 5)]
    public int Id { get; set; }

    [Display(Order = 0)]
    public string Title { get; set; }

    [Display(Order = 3)]
    public DateTime FromDate { get; set; }

    [Display(Order = 4)]
    public DateTime ThruDate { get; set; }
}

ModelMetadata.Properties默认情况下按该属性值排序。

请注意,在某些情况下(但请参见下文!),这仅在您的模型中使用继承时才有意义 - 因为如果所有属性都定义在单个 ViewModel 类上,则将它们按正确的顺序放置会更简单首先上课,即:

public class ViewModel
{
    public string Title { get; set; }
    public string Party { get; set; }
    public SomeRole PartyRole { get; set; }
    public DateTime FromDate { get; set; }
    public DateTime ThruDate { get; set; }
    public int Id { get; set; }
}

后期添加,2021 年然而,源顺序实际上是一个实现细节 - 不保证反射按源顺序返回属性(尽管它们通常在实践中)。这样做的安全方法是使用某种Order属性。

在 MVC 的情况下,您仍然需要Display(Order = ...)像上面一样使用属性,但在其他情况下 - 如果属性的使用者是您自己的代码,请注意有一个技巧不需要您手动定义顺序 - 您可以创建您自己的OrderAttribute并在其构造函数中使用该属性,以确保“自动”按源顺序CallerLineNumber对用您的属性 () 修饰的属性进行排序:[Order]

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public sealed class OrderAttribute : Attribute
{
    public int Order { get; }
    public OrderAttribute([CallerLineNumber] int order = 0)
    {
        Order = order;
    }
}
于 2013-08-06T08:55:21.183 回答