asp.net Mvc中实现在View页面中嵌入公用动态数据,实现方法为:include(包含动态页面数据)
最近两个月正在由工厂模式转型asp.net Mvc开发,刚刚处理完一个类似.net中UserControl(用户控件,以下简称"uc")完全可以实现的功能(由于考虑到uc对网页请求数据的性能问题,产品经理建议在.net中使用include功能)。于是今天研究了一下在mvc中使用include动态显示共有数据,期间发现了个问题,值得大家一起讨论一下:
这是共有数据的页面我把它建在views中:
SafetyLevel.aspx:
<label class="status">
<%=ViewData["Level"]%></label>
这是前台数据显示页面,同样也在views中:
Index.aspx:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>我的首页</title>
<link href="../../css/public.css" type="text/css" rel="stylesheet" />
<link href="../../css/index.css" rel="stylesheet" type="text/css" />
<link href="../../css/model.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="../../js/gx-jquery142.js"></script>
<script type="text/javascript" src="../../js/Checkform.js"></script>
</head>
<body>
<form action="/User/Index" method="post" name="form1" enctype="multipart/form-data">
<div class="mainCRCMLTop">
<div class="mainCRCMLTLeft">
<img src="../../img/UserHeader.jpg" />
</div>
<div class="mainCRCMLTRight">
<h1>
木古古</h1>
<ul>
<li class="Myprice">当前金币: 20<span class="MPright"><a href="#">充值</a><a href="我的账户.html">账户</a></span></li>
<li class="Mysafe">账号安全:
<!-- #Include File="SafetyLevel.aspx" -->
<%=ViewData["Level"]%>
</li>
</ul>
</div>
</div>
</form>
</body>
</html>
这里是:controller相关代码:
private UserService userservice;//声明用户service
private UserStaticService staticservice;//声明用户静态表底层处理类
public UserController()
{
userservice = new UserService();
staticservice = new UserStaticService();
}
public ActionResult Index()
{
ViewData["Level"] = GetSafetyLevel();
return View();
}
public ActionResult SafetyLevel()
{
long userId = CookieHelper.GetLoginUserId();
UserStatic userstatic = staticservice.Get(userId);
ViewData["Level"] = "";
int level = Convert.ToInt32(userstatic.Extend3);//安全级别数由绑定项数规定(绑定项数(手机绑定、邮箱绑定、密保设置))
if (level >= 0)
{
if (level == 0)
{
ViewData["Level"] = "<span class='empty'>安全等级(无)</span>";
}
else if (level == 1)
{
ViewData["Level"] = "<span class='feeble'>弱</span>";
}
else if (level == 2)
{
ViewData["Level"] = "<span class='middle'>中</span>";
}
else
{
ViewData["Level"] = "<span class='strong'>强</span>";
}
}
return View();
}
#region 返回安全级别数
public string GetSafetyLevel()
{
long userId = CookieHelper.GetLoginUserId();
UserStatic userstatic = staticservice.Get(userId);
string safetylevel = "";
int level = Convert.ToInt32(userstatic.Extend3);//安全级别数由绑定项数规定(绑定项数(手机绑定、邮箱绑定、密保设置))
if (level >= 0)
{
if (level == 0)
{
safetylevel = "<label class='status'><span class='empty'>安全等级(无)</span></label>";
}
else if (level == 1)
{
safetylevel = "<label class='status'><span class='feeble'>弱</span></label>";
}
else if (level == 2)
{
safetylevel = "<label class='status'><span class='middle'>中</span></label>";
}
else
{
safetylevel = "<label class='status'><span class='strong'>强</span></label>";
}
}
return safetylevel;
}
#endregion
说明:账号安全级别处为公用部分(<!-- #Include File="SafetyLevel.aspx" --> ) ,本来以为在controller中将SafetyLevel.aspx的 ViewData["Level"] 然后将 <!-- #Include File="SafetyLevel.aspx" --> 放入Index.aspx页面的公用部分就可以实现类似用户控件的效果了,可事实不然。Index.aspx页面根本无法读取到 SafetyLevel.aspx 页面中的数据,后来调试发现,如果我把public ActionResult SafetyLevel()方法中的代码考到public ActionResult Index()方法中,刷新Index.aspx页面竟然拿到了共用部分的数据,及此时SafetyLevel.aspx 的代码页面中也能读取到数据了。于是我把public ActionResult SafetyLevel()方法中的代码提取出来写了个返回字符串的方法public string GetSafetyLevel(),这样的只要哪个action方法对应得views页面需要显示共用部分的数据,就可以将ViewData["Level"] = GetSafetyLevel() 其放入action方法中。对应的页面如果需要用Include实现,可以这样写:“<!-- #Include File="SafetyLevel.aspx" --> ” ,如果不需要中间页面的话,也可以这样编写:“<%=ViewData["Level"]%> ” 公用动态数据部分。
注:功能是实现了,可能会有些地方不太适应,如果大家有什么更好的方法,希望提出来我们交流共享一下。呵呵...