HtmlHelper

HtmlHelper类

public class HtmlHelper<TModel> : HtmlHelper类

因为HtmlHelper<TModel>继承自HtmlHelper,所以HtmlHelper<TModel>的对象,两者的扩展方法都可以使用.

在View页面中使用的Html,是 public abstract class WebViewPage<TModel> : WebViewPage中的一个属性,类型是HtmlHelper<TModel>.可以使用所有的这些扩展的方法

clip_image001

clip_image002

HtmlHelper<TModel> :对HtmlHelper的继承,主要是通过通过ViewDataDictionary<TModel>对ViewDataDictionary的继承实现的.

ViewDataDictionary<TModel>中对Model属性进行了重写覆盖隐藏,以达到泛型的目的.主要是处理Model的类型

public class ViewDataDictionary<TModel> : ViewDataDictionary
    {

        public ViewDataDictionary()

            :

            base(default(TModel))
        {

        }

        public ViewDataDictionary(TModel model)

            :

            base(model)
        {

        }

        public ViewDataDictionary(ViewDataDictionary viewDataDictionary)

            :

            base(viewDataDictionary)
        {

        }

        public new TModel Model
        {

            get { return (TModel)base.Model; }

            set { SetModel(value); }

        }

        public override ModelMetadata ModelMetadata
        {

            get
            {

                ModelMetadata result = base.ModelMetadata;

                if (result == null) {

                    result = base.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(TModel));

                }

                return result;

            }

            set { base.ModelMetadata = value; }

        }

        protected override void SetModel(object value)
        {

            bool castWillSucceed = TypeHelpers.IsCompatibleObject<TModel>(value);

            if (castWillSucceed) {

                base.SetModel((TModel)value);

            } else {

                InvalidOperationException exception = (value != null)

                ? Error.ViewDataDictionary_WrongTModelType(value.GetType(), typeof(TModel))

                : Error.ViewDataDictionary_ModelCannotBeNull(typeof(TModel));

                throw exception;

            }

        }

    }

HtmlHelper<T>.Edit 泛型方法的第一个参数已经通过对象的类型指定了,不能是别的类型,必须和Helper的实例泛型类型相同

HtmlHelper<T>.EditFor 泛型方法可以根据参数推断出泛型类型.

HtmlHelper<T>.EditForModel Html对象有Model的相关信息,所以可以根据元数据信息生成页面代码.

原文地址:https://www.cnblogs.com/zhangliming/p/4567277.html