在项目中有一个Html.DropDownListFor放在一个分部视图中,而后调用这个分部视图时须要动态控制这个DropDownList的显示方式,好比宽度、是否禁用、是否列表等,这些值的设置都在 Html.DropDownListFor的htmlAttributes参数中设置,如:html
@Html.DropDownListFor(m => m.ClassID, ViewBag.List as SelectList, new { @style = "width:280px;", size = "20", disabled = "disabled" })
对于这个htmlAttributes,它可接受的数据类型能够是一个Object或IDictionary(string,Object),而咱们在DropDownListFor扩展方法中所写的new { @style = "width:280px;"}实际上是一个匿名类。less
题外话,关于匿名类函数
顾名思义 匿名类型就是没有名字的类型。在C#3.0中容许咱们在程序中声明一个临时的类型来存储数据,例如:gradle
class Program { static void Main(string[] args) { //声明一个匿名对象,拥有 Name和Age 属性 var obj = new { Name = "Joey", Age = 25 };//这里的new { Name = "Joey", Age = 25 } 就是一个匿名类型 ,obj则是这个类型的一个对象,称为匿名对象 Console.WriteLine("匿名对象obj : Name=" + obj.Name + " , Age=" + obj.Age); } }
上述代码中,咱们声明了一匿名对象obj ,而后输出对象的属性值。若是在VS 你将鼠标移到 obj前面的var 上面,vs 会提示:obj 是一个匿名类型 ‘a 。这个‘a 是编译器自动做为标识的一个类型,匿名对象在编译时,编译器仍是得给它一个类型,关于匿名类型的资料网上不少,为避免偏离主题,此处仅作示例。ui
知道了这个匿名类,咱们能够象下面这种方式来调用:spa
var attList = new { @style = "width:280px;", size = "20" }; @Html.DropDownListFor(m => m.ClassID, ViewBag.List as SelectList, attList)
可是当咱们试图去更改属性值的时候,VS会提示没法对属性赋值,如图:htm
这是由于这个匿名类的相关属性只有get属性,没有set属性。对象
接下来,咱们经过创建一个非匿名类来实现 htmlAttributes的动态调用。blog
创建一个cs文件,而后在这个cs文件中新建一个 htmlAttributes 属性类,代码以下:get
public class AttClass { public string style { get; set; } public string size { get; set; } }
而后在VIEW中实例化这个类并为其属性赋值:
AttClass att = new AttClass();
att.size = "20"; att.style = "width:800px";
完成后就能够在DropDownListFor中使用这个实例化的对象了
@Html.DropDownListFor(m => m.ClassID, ViewBag.List as SelectList, att)
经过 IDictionary字典 实现动态控制 htmlAttributes 属性
htmlAttributes可接受的数据类型能够是IDictionary(string,Object),那咱们能够直接在代码中使用字典的方式添加属性,而后为DropDownListFor赋值:
IDictionary<string, object> att = new Dictionary<string, object>(); att.Add("size","30"); att.Add("style", "width:280px;"); @Html.DropDownListFor(m => m.ClassID, ViewBag.List as SelectList, att)
应用非匿名类及字典的方式均可以实现对htmlAttributes的动态控制,实际使用中,IDictionary的代码量较少,应用也比较灵活。
补充:关于动态控制routeValues的方法
好比咱们调用一个Url.Action方法,其中的routeValues不能直接使用上面的IDictionary来实现,但可使用RouteValueDictionary来实现。
@{
RouteValueDictionary att = new RouteValueDictionary();
att.Add("tbPre", "Module"); att.Add("FirstText", "做为一级分类"); if (!string.IsNullOrEmpty(Html.ViewContext.RouteData.Values["id"].ToString())) { att.Add("SelectedValue", Html.ViewContext.RouteData.Values["id"]); } } @Html.Action("index", "ClassList", att)
另外,RouteValueDictionary的构造函数也提供了在初始化RouteValueDictionary对象的时候将IDictionary复制元素到RouteValueDictionary中的方法。