1

我知道在使用 EditorForModel 时通常不会呈现复杂类型,但我使用的是自定义对象模板,该模板不进行检查并为包括复杂类型在内的每个属性调用 Html.Editor。

不幸的是,虽然我可以在对象模板中看到属性的正确 TemplateHint 值,但编辑器调用似乎没有使用它,而是使用了内置的集合模板。

我的对象模板基本上是这样的:

@foreach (var property in ViewData.ModelMetadata.Properties.Where(x => x.ShowForEdit))
{
  @Html.Editor(property.PropertyName)
}

如果我通过将名称传递给 Editor 调用来强制使用模板,则模板中的 ModelMetadata 为空。

这是一个错误/有任何解决方法吗?

更多信息:

所以我的视图模型包含以下内容:

[ACustomAttribute("Something")]
public IEnumerable<int> SelectedOptions { get; set; }

该属性实现了 IMetadataAware 并将一些内容添加到 ModelMetadata 的 AdditionalValues 集合以及设置 TemplateHint。我可以从对象模板中读取这些数据,但不能从我的自定义模板中读取。

4

1 回答 1

2
@foreach (var property in ViewData.ModelMetadata.Properties.Where(x => x.ShowForEdit))
{
    if (!string.IsNullOrEmpty(property.TemplateHint))
    {
        @Html.Editor(property.PropertyName, property.TemplateHint)
    }
    else
    {
        @Html.Editor(property.PropertyName)
    }
}

但请注意,如果您不依赖已建立的约定来解析复杂集合类型(又名)的模板,并且在您的集合属性上~/Views/Shared/EditorTemplates/NameOfTheTypeOfCollectionElements.cshtml使用了 an :UIHint

[UIHint("FooBar")]
public IEnumerable<FooViewModel> Foos { get; set; }

那么~/Views/Shared/EditorTemplates/FooBar.cshtml编辑器模板必须是强类型的,IEnumerable<FooViewModel>而不是FooViewModel. 所以要小心,如果这是你的情况,如果你想访问集合的各个项目,你可以在这个自定义模板中循环。它将不再是 ASP.NET MVC,它会自动为您循环并为每个元素调用编辑器模板。


更新:

仍然无法重现您的问题。

自定义属性:

public class ACustomAttribute : Attribute, IMetadataAware
{
    private readonly string _templateHint;
    public ACustomAttribute(string templateHint)
    {
        _templateHint = templateHint;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["foo"] = "bar";
        metadata.TemplateHint = _templateHint;
    }
}

模型:

public class MyViewModel
{
    [ACustom("Something")]
    public IEnumerable<int> Foos { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Foos = Enumerable.Range(1, 5)
        };
        return View(model);
    }
}

查看 ( ~/Views/Home/Index.cshtml):

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.EditorForModel()
}

对象类型 ( ~/Views/Shared/EditorTemplates/Object.cshtml) 的编辑器模板:

@foreach (var property in ViewData.ModelMetadata.Properties.Where(x => x.ShowForEdit))
{
    if (!string.IsNullOrEmpty(property.TemplateHint))
    {
        @Html.Editor(property.PropertyName, property.TemplateHint)
    }
    else
    {
        @Html.Editor(property.PropertyName)
    }
}

自定义编辑器模板 ( ~/Views/Shared/EditorTemplates/Something.cshtml):

@model IEnumerable<int>

<h3>
    @ViewData.ModelMetadata.AdditionalValues["foo"]
</h3>

@foreach (var item in Model)
{
    <div>
        @item
    </div>
}

结果:

在此处输入图像描述

如您所见,我们添加的其他元数据显示在模板中。

于 2012-08-10T12:34:57.867 回答