• MVC在VIEW中动态控制htmlAttributes的方法


    MVC在VIEW中动态控制htmlAttributes的方法

    在项目中有一个Html.DropDownListFor放在一个分部视图中,然后调用这个分部视图时需要动态控制这个DropDownList的显示方式,比如宽度、是否禁用、是否列表等,这些值的设置都在 Html.DropDownListFor的htmlAttributes参数中设置,如:

    @Html.DropDownListFor(m => m.ClassID, ViewBag.List as SelectList, new { @style = "280px;", size = "20", disabled = "disabled" })

    对于这个htmlAttributes,它可接受的数据类型可以是一个Object或IDictionary(string,Object),而我们在DropDownListFor扩展方法中所写的new { @style = "280px;"}其实是一个匿名类。

    题外话,关于匿名类

    顾名思义 匿名类型就是没有名字的类型。在C#3.0中允许我们在程序中声明一个临时的类型来存储数据,例如:

    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 是编译器自动作为标识的一个类型,匿名对象在编译时,编译器还是得给它一个类型,关于匿名类型的资料网上很多,为避免偏离主题,此处仅做示例。

    通过非匿名类的方式动态控制htmlAttributes

    知道了这个匿名类,我们可以象下面这种方式来调用:

    var attList = new { @style = "280px;", size = "20" };
    @Html.DropDownListFor(m => m.ClassID, ViewBag.List as SelectList, attList)

    但是当我们试图去更改属性值的时候,VS会提示无法对属性赋值,如图:

    这是因为这个匿名类的相关属性只有get属性,没有set属性。

    接下来,我们通过建立一个非匿名类来实现 htmlAttributes的动态调用。

    建立一个cs文件,然后在这个cs文件中新建一个 htmlAttributes 属性类,代码如下:

    public class AttClass
        {
            public string style { get; set; }
    
            public string size { get; set; }
        }

    然后在VIEW中实例化这个类并为其属性赋值:

    AttClass att = new AttClass();
    att.size = "20";
    att.style = "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", "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中的方法。

  • 相关阅读:
    图片尺寸批量resize的matlab并行代码
    Java使用QRCode.jar生成与解析二维码
    MySQL求两表的差集(非交集)
    sql笔记
    Oracle创建表空间创建用户授权
    身份证前6位地址码+码表+MySQL
    Jenkins时区设置为北京时间
    Oracle 使用MERGE INTO 语句 一条语句搞定新增编辑
    Oracle dd-m月-yy转yyyy-mm-dd
    docker 使用笔记
  • 原文地址:https://www.cnblogs.com/maijin/p/7003706.html
Copyright © 2020-2023  润新知