11

随着 MVC 2 添加了 HtmlHelper EditorFor() ,不可能为给定的模型对象创建强类型的显示和编辑器模板,在摆弄它之后,我对如何将额外的模型数据传递给编辑器而不丢失编辑器控件的强类型。

经典示例:产品具有类别。ProductEditor 有一个包含所有类别名称的类别下拉列表。ProductEditor 是 Product 的强类型,我们需要传入类别的 SelectList 以及 Product。

使用标准视图,我们会将模型数据包装在新类型中并传递。使用 EditorTemplate,如果我们传入包含多个对象的混合模型,我们将失去一些标准功能(我注意到的第一件事是所有 LabelFor/TextBoxFor 方法都在生成实体名称,例如“Model.Object”,而不仅仅是“Object ”)。

我做错了还是应该 Html.EditorFor() 有一个额外的 ViewDataDictionary/Model 参数?

4

3 回答 3

13

您可以创建一个具有这两个属性的自定义 ViewModel,或者您需要使用 ViewData 来传递该信息。

于 2009-08-08T05:17:45.253 回答
5

我仍在学习,但我遇到了类似的问题,我为此制定了解决方案。我的类别是一个枚举,我使用一个模板控件检查枚举以确定 Select 标记的内容。

它在视图中用作:

<%= Html.DropDownList
            (
            "CategoryCode",
            MvcApplication1.Utility.EditorTemplates.SelectListForEnum(typeof(WebSite.ViewData.Episode.Procedure.Category), selectedItem)
            ) %>

Category 的枚举用 Description 属性修饰,用作 Select 项中的文本值:

 public enum Category 
        {
            [Description("Operative")]
            Operative=1,
            [Description("Non Operative")]
            NonOperative=2,
            [Description("Therapeutic")]
            Therapeutic=3 
        }
        private Category _CategoryCode; 
        public Category CategoryCode 
        {
            get { return _CategoryCode; }
            set { _CategoryCode = value; }
        }

SelectListForEnum 使用枚举定义和当前选定项的索引构造选定项列表,如下所示:

        public static SelectListItem[] SelectListForEnum(System.Type typeOfEnum, int selectedItem)
    {
        var enumValues = typeOfEnum.GetEnumValues();
        var enumNames = typeOfEnum.GetEnumNames();
        var count = enumNames.Length;
        var enumDescriptions = new string[count];
        int i = 0;
        foreach (var item in enumValues) 
        {
            var name = enumNames[i].Trim();
            var fieldInfo = item.GetType().GetField(name);
            var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
            enumDescriptions[i] = (attributes.Length > 0) ? attributes[0].Description : name;
            i++;
        }
        var list = new SelectListItem[count];
        for (int index = 0; index < list.Length; index++)
        {
            list[index] = new SelectListItem { Value = enumNames[index], Text = enumDescriptions[index], Selected = (index == (selectedItem - 1)) };
        }
        return list;
    }

最终结果是一个精美呈现的 DDL。

希望这可以帮助。任何有关更好方法的评论将不胜感激。

于 2009-12-14T08:38:55.253 回答
4

尝试使用 ViewData.ModelMetadata 这包含你所有的类注解。

优秀的文章http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

于 2009-12-30T18:51:40.207 回答