MVC在VIEW中动态控制htmlAttributes和routevalues的方法
在项目中有一个Html.DropDownListFor放在一个分部视图中,然后调用这个分部视图时需要动态控制这个DropDownList的显示方式,比如宽度、是否禁用、是否列表等,这些值的设置都在Html.DropDownListFor的htmlAttributes参数中设置,如:
@Html.DropDownListFor(m => m.ClassID, ViewBag.List as SelectList, new { @style = "width:280px;", size = "", disabled = "disabled" })
对于这个htmlAttributes,它可接受的数据类型可以是一个Object或IDictionary(string,Object),而我们在DropDownListFor扩展方法中所写的new { @style = "width:280px;"}其实是一个匿名类。
题外话,关于匿名类
顾名思义 匿名类型就是没有名字的类型。在C#3.0中允许我们在程序中声明一个临时的类型来存储数据,例如:
class Program
{
static void Main(string[] args)
{
//声明一个匿名对象,拥有 Name和Age 属性
var obj = new { Name = "Joey", Age = };//这里的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 = "width:280px;", size = "" };
@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 = "";
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","");
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中的方法。
MVC在VIEW中动态控制htmlAttributes和routevalues的方法的更多相关文章
- MVC在VIEW中动态控制htmlAttributes的方法
@{ IDictionary<string, object> dic = new Dictionary<string, object>(); dic.Add("cla ...
- asp.net mvc 在View中获取Url参数的值
如果url是 /home/index?id=3 直接Request就ok. 但是如果路由设定为:{controller}/{action}/{id} url是 /home/index/3 这时想在 ...
- Asp.Net Core MVC在View中,根据用户权限动态生成菜单
1. 用户登录时,将用户的权限写入Cookie: //将需要的信息写入claims后 var identity = new ClaimsIdentity(claims, IdentityConstan ...
- ASP.Net MVC 在控制器中获取View中的form表单值的方法
在网站开发中,我们常常需要用到表单提交的方式,那么在MVC中是如何获取到表单中的数据呢?下面我们来介绍以下几种方式 首先我们先看看View前台页面 添加一个控制器 我们再看看前台页面的代码 @{ La ...
- ASP.NET MVC 获得 view 中的HTML并将其中的内容自动转换成繁体中文。
一.思路 1.获得 asp.net mvc 输出的 html 的字符串. 2.将拿到的 html 字符串中的简体中文转换成繁体中文. 3.输出 html. 二.实现 1.扩展 RazorView 视图 ...
- MVC在View中页面跳转
在做人事系统的时候须要用到页面跳转,那么页面跳转究竟用什么方法好呢?依照曾经的思路,我就会这么写. <span style="font-size:18px;">wind ...
- 在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能
在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发“为xxx执行子请求时出错”的HttpException ...
- ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法
这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...
随机推荐
- Android 蓝牙 BLE 开发笔记
最近公司头戴换了一块蓝牙4.0 BLE模块,所以我们Android组要适配 BLE.Android BLE 需要 4.3 以上系统,api 还是非常简单的, 第一步就是扫描, 扫描到设备后就可以连接了 ...
- The number of divisors(约数) about Humble Numbers[HDU1492]
The number of divisors(约数) about Humble Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- BZOJ3735 : [Pa2013]Konduktorzy
二分一个最大的位置$x$,计算$t=\sum_{i=1}^k\lfloor\frac{x}{a_i}\rfloor$. 如果$t\leq n$,那么说明就算全部检票员都走到了这里,也不够$n$个指令, ...
- WebRTC手记之本地音频采集
转载请注明出处:http://www.cnblogs.com/fangkm/p/4374668.html 上一篇博文介绍了本地视频采集,这一篇就介绍下音频采集流程,也是先介绍WebRTC原生的音频采集 ...
- JavaScript验证函数大全
1. 长度限制 <script> function test() { if(document.a.b.value.length>50) { alert("不能超过50个字符 ...
- Html - 对话箭头
对话箭头 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="U ...
- 【产品更新】EVC8013 硬件更新!
EVC8013 三合一磁耦合隔离转换器(USB转RS-232 / RS-485 / RS-422 ),迎来一次硬件大幅度升级,升级不加价! 本次升级主要有以下几个方面: 1.采用第二代金升阳 3000 ...
- 动态input file多文件上传到后台没反应的解决方法!!!
其实我也不太清除具体是什么原因,但是后面就可以了!!! 我用的是springMVC 自带的文件上传 1.首先肯定是要有springMVC上传文件的相关配置! 2.前端 这是动态input file上传 ...
- ubuntu&FAQ
转自-笨小孩 查看进程: ,ps -e 命令 ,feng@feng:~$ sudo netstat -antup Active Internet connections (servers an ...
- PHP Console工具使用分享
PHP Console工具使用分享 http://www.open-open.com/lib/view/open1416193590414.html 您的评价: 不错 收藏该经验 ...