我C#
在 ASP.NET MVC 5 框架的顶部编写了一个项目。我试图将我的视图与我的视图模型分离,以便我可以使我的视图可重用。通过大量使用,EditorTemplates
我能够通过评估ModelMetadata
模型上每个属性的数据注释属性和数据注释属性来创建所有标准视图(即创建、编辑和详细信息),然后渲染页面。我唯一感到困惑的是如何渲染Index
视图。
我的索引视图通常接受一个IEnumerable<object>
或IPagedList<object>
集合。在我看来,我希望能够评估集合中每个object
/record 的 ModelMetadata 以确定是否object
应该显示上的属性。
换句话说,我的视图模型看起来像这样
public class DisplayPersonViewModel
{
public int Id{ get; set; }
[ShowOnIndexView]
public string FirstName { get; set; }
[ShowOnIndexView]
public string LastName { get; set; }
[ShowOnIndexView]
public int? Age { get; set; }
public string Gender { get; set; }
}
然后我的Index.cshtml
视图将接受IPagedList<DisplayPersonViewModel>
集合中的每条记录,我想显示用属性修饰的ShowOnIndexView
属性的值。
通常,我可以用类似这样的方法在我的视图中评估 ModelMetadata
@model IPagedList<object>
@{
var elements = ViewData.ModelMetadata.Properties.Where(metadata => !metadata.IsComplexType && !ViewData.TemplateInfo.Visited(metadata))
.OrderBy(x => x.Order)
.ToList();
}
<tr>
@foreach(var element in elements)
{
var onIndex = element.ContainerType.GetProperty(element.PropertyName)
.GetCustomAttributes(typeof(ShowOnIndexView), true)
.Select(x => x as ShowOnIndexView)
.FirstOrDefault(x => x != null);
if(onIndex == null)
{
continue;
}
@Html.Editor(element.PropertyName, "ReadOnly")
}
</tr>
然后我的控制器看起来像这样
public class PersonController : Controller
{
public ActionResult Index()
{
// This would be a call to a service to give me a collection with items. but I am but showing the I would pass a collection to my view
var viewModel = new List<DisplayPersonViewModel>();
return View(viewModel);
}
}
然而,评估的问题ModelMetadata
在于IPagedList<DisplayPersonViewModel>
它给了我关于集合本身的信息,而不是关于集合中的泛型类型或单个模型的信息。换句话说,我得到诸如总页数、每页项目数、总记录数之类的信息。
问题
如何访问ModelMetadata
集合中每一行的信息,以便能够知道要显示哪些属性,哪些不显示?