Html Helpers BulletedList

本文详细介绍了ASP.NET MVC中ViewData与Eval的使用方法,包括ViewData内部实现原理、如何通过Eval简化视图中的数据访问,以及一些高级用法。文章通过实例展示了Eval方法的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public static string BulletedList(this HtmlHelper helper, string name)
        {
            var items = helper.ViewData.Eval(name) as IEnumerable;
            if (items == null)
                throw new NullReferenceException("Cannot find " + name + " in view data");

            var writer = new HtmlTextWriter(new StringWriter());
            
            // Open UL
            writer.RenderBeginTag(HtmlTextWriterTag.Ul);
            foreach (var item in items)
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Li);
                writer.Write(helper.Encode(item));
                writer.RenderEndTag();
                writer.WriteLine();
            }
            // Close UL
            writer.RenderEndTag();

            // Return the HTML string
            return writer.InnerWriter.ToString();
        }

 

/**************************************************************************/

View & ViewData(转自:http://hi.baidu.com/kongfl888/item/ebc72ddc10777813e0f46f81

ViewData 似乎没啥好说的,一个向 View 传送数据的字典。

--------------------------------------------------------------------------------

public class ViewDataDictionary : IDictionary<string, object>
{
  private readonly Dictionary<string, object> _innerDictionary = 
    new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
}  

------------------------------------------------------------------

  嗯,内部存储字典的 Key 不区分大小写。

  ViewDataDictionary 内部唯一有些特殊的就是 Eval 方法,它让视图开发人员用很简便的方式显示数据,省了类型转换等麻烦。

-------------------------------------------------------------------------------------

public ActionResult Index()
{
  ViewData["user"] = new User { Name = "Tom", Age = 13 };
  return View();
}

  Index.aspx

<%= (ViewData["user"] as User).Name %>
<br />
<%= ViewData.Eval("user.Name") %>

------------------------------------------------------------------

  对比之下,Eval() 就简单明多了。当你习惯使用匿名类型时,就知道 Eval() 的好处了。

------------------------------------------------------------------------------------

public ActionResult Index()
{
  ViewData["user"] = new { Name = "Tom", Age = 13 };
  return View();
}

  Index.aspx

<%= ViewData.Eval("user.Name") %>

----------------------------------------------------

  Eval() 还能处理更深度的访问。

--------------------------------------------------------------------------

public ActionResult Index()
{
  ViewData["user"] = new
  {
    Name = "Tom",
    Age = 13,
    Data = new { X = 1, Y = 2 }
  };
  return View();
}

  Index.aspx

<%= ViewData.Eval("user.Data.y") %>

-----------------------------------------------------------

  ViewData Key 还允许出现 "." 符号,试试看。

----------------------------------------------------------------------------

public ActionResult Index()
{
  ViewData["user.xxx"] = new
  {
    Name = "Tom",
    Age = 13,
    Data = new { X = 1, Y = 2 }
  };
  return View();
}

  Index.aspx

<%= ViewData.Eval("user.xxx.Data.y") %>

----------------------------------------------------------

  Eval() 会按照如下方式尝试读取 ViewData 数据。

--------------------------------------------------------------------------------

ViewData["user.xxx.Data.y"]
ViewData["fuser.xxx.Data"]["y"]
ViewData["fuser.xxx"]["Data.y]
ViewData["user.xxx"]["Data"]["y"]
ViewData["user"]["xxx.Data.y"]
ViewData["user"]["xxx.Data"]["y"]
ViewData["user"]["xxx"]["Data.y"]
ViewData["user"]["xxx"]["Data"]["y"]

----------------------------------------------------------------

  这个看着有点别扭,还是少写这样的代码为好。只所以这么写伪码,是因为 Eval() 支持从 Dictionary 中读取数据。

--------------------------------------------------------------------------------

public ActionResult Index()
{
  ViewData["user"] = new
  {
    Name = "Tom",
    Age = 13,
    Data = new Dictionary<string, int> { { "x", 1 }, { "y", 2 } }
  };
  return View();
}

  Index.aspx

<%= ViewData.Eval("user.Data.y") %>

----------------------------------------------------------

转载于:https://www.cnblogs.com/yezhi/archive/2012/09/26/2704795.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值