ASP.NET MVC 上下文对象使用单例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET MVC 上下文对象使用单例相关的知识,希望对你有一定的参考价值。

假设程序中有这样一个数据库上下文对象:SchoolEntities:DbContext
那么基本每个控制器都会创建该对象的一个实例以进行各种(增删改查)操作:private SchoolEntities db = new SchoolEntities();
既然这么多地方会创建相同的实例,为何不用单例,返回其唯一一个实例?
使用单例的话,会有什么不好的地方吗?

我回答问题首先希望帮助到学习C#的后辈。

所以先分析原因。
你出现这个错误是因为你没有了解ASP.NET的工作原理。ASP.Net 和php,jsp ,asp等服务器语言一样 都是为了生成可供浏览器解析的页面,而可供浏览器解析的语言只有html

1,如果你在aspx页面中插入一个asp:LinkButton 那么运行页面后 在浏览器中查看源代码你会发现这个标签实际被转为了一个<a>标签。
2,为什么你的写法不会转换呢?因为首先 传递给Literal1.Text 的值在asp.net中作为一段字符串被直接输出到浏览器中。那么你的写法到浏览器后源代码中仍然是一个asp:LinkButton 标签,而这个标签是无法被浏览器正确解析的。

解决办法:
知道了原因,那么如果非要按照你的写法去写,那么应该是这样的:
Literal1.Text = "<li>" + ((users)Session["users"]).Name.ToString() + "</li><li> </li><li><a ID='LinkButton1' onclick='LinkButton1_Click1'>注销</a></li><li> </li><li>信息修改</li><li> </li>";
但是当你修改完后发现点击注销按钮依然不能执行!为什么呢?
因为你的LinkButton1_Click1 事件并没有在asp.net中被解析为可供浏览器识别的js代码。

如何解决?

首先吐槽下你的写法实在另类, 但是依然可以实现。

在aspx页面中写一个asp:LinkButton按钮:
<asp:LinkButton ID='LinkButton2' runat='server' onclick='LinkButton1_Click1'>注销</asp:LinkButton>

运行页面,查看源代码 看看这个新加的注销按钮被解析为了什么html代码,大概如下
<a id="LinkButton2" onclick="xxxxx"></a>

将新加的linkbutton 设置不可见属性
<asp:LinkButton ID='LinkButton2' runat='server' visible="false" onclick='LinkButton1_Click1'>注销</asp:LinkButton>

重新修改后台代码
Literal1.Text = "<li>" + ((users)Session["users"]).Name.ToString() + "</li><li> </li><li><a ID='LinkButton1' onclick='xxxxx'>注销</a></li><li> </li><li>信息修改</li><li> </li>";
//也就是将标签的js事件绑定到那个隐藏的注销按钮事件上。
希望对你有帮助
参考技术A 你看看单例模式 优缺点 不就可以了 。

以上是关于ASP.NET MVC 上下文对象使用单例的主要内容,如果未能解决你的问题,请参考以下文章

模拟 Asp.net-mvc 控制器上下文

ASP.NET MVC IOC依赖注入之Autofac系列开篇

如何在 Spring.Net 应用程序上下文中添加 ASP.NET MVC 控制器?

asp.net mvc 从多个上下文加载相关数据

使用 ASP.NET Core MVC 创建 Web API

ASP.NET MVC 2 中的上下文/RunWhen 验证?