asp.net mvc(一) ----------简单封装成通用的List<T>集合
asp.net mvc(一)
这些天开始学习asp.net mvc,用传统的asp.net已经快四的年了,刚开始接触asp.net mvc确认感觉有点不适应,主要体现在asp.net mvc的实现上。
问题一:要想学习asp.net mvc,我个人觉的最重要的一步是知道mvc路由机制,传统的asp.net程序要想访问一个页面,都是根据页面路径来访问,但MVC并不能直接访问aspx页面。
问题二:理解MVC三部分的含义和用法。当我们创建一个asp.net mvc应用程序时,系统会默认生成三个文件夹:
1:Controllers,对应MVC中的C,主要是处理所有请求与做出对应的响应;
2:Models,对应MVC中的M,相当时我们平时创建工程中的实体工程,只不过在MVC中它充当了存放数据模型的作用;
3:Views,对应MVC中的V,这里就是存放用户访问的页面文件,但是这个文件不能在浏览器中根据路径访问。
对于系统生成的asp.net mvc项目,我对其做了如下扩展:
扩展点一:系统之所以在web工程中直接创建了三个文件夹,是为了更加直观的体现MVC模式,真正项目中我们需要把它们分开。
扩展点二:MVC中重要的路由处理,默认情况是在Global.asax文件中,我们也可以把这块内容独立出来。
扩展点三:把Controller类和业务逻辑分离,这里可以采用Repository模式。
案例DEMO:创建一个简单的留言簿的项目,数据存储采用sql,本想用linq to entity,但总觉的这部分还相关不完善,且性能存在问题,故使用传统ado.net实现数据存储。下面是这个项目的分层。
1:GuestBook.Web,页面表示层 ,MVC中的V。
2:GuestBook.MVC.Controller,存放项目所有的Controller,MVC中的C。我们知道Controller有两个作用:第一,处理请求;第二,做出对应的响应。第二点就是我们平时理解的后台功能实现,例如数据的增删改查等。我们可以把这部分功能与Controller分离,即所有的业务逻辑都写在业务逻辑层,不直接依赖Controller,我们可以进一步把这些功能点抽象出来,让Controller依赖一个公共的接口。这个思想我之前的一篇文章有点异曲同工之处:对增删改查用面向对象进行包装
首先:创建一个Repository接口:IRepository.cs,里面包含些常见数据处理操作方法:这个接口是一个泛型接口,以实现所有实体类的通用性。
public interface IRepository<T>
{
List<T> FindAllInfo();
T GetInfo(T model);
bool Add(T model);
bool Delete(T model);
bool Edit(T model);
}
然后:实现一条留言的数据处理:
public List<GuestBookInfo> FindAllInfo()
{
string sql = "select * from GuestBook"; List<GuestBookInfo> list = new List<GuestBookInfo>();
using(SqlDataReader dr=SqlHelper .ExecuteReader (conn ,CommandType .Text ,sql ))
{
while (dr.Read())
{
GuestBookInfo model = new GuestBookInfo();
model.ID = int.Parse (dr["ID"].ToString());
model.sTitle = dr["sTitle"].ToString();
model.sContent = dr["sContent"].ToString();
list.Add(model);
} }
return list ;
}
public GuestBookInfo GetInfo(GuestBookInfo model)
{
string sql = "select * from GuestBook where ID="+model.ID .ToString ();
using (SqlDataReader dr = SqlHelper.ExecuteReader(conn, CommandType.Text, sql))
{
if (dr.Read())
{
model.ID = int.Parse(dr["ID"].ToString());
model.sTitle = dr["sTitle"].ToString();
model.sContent = dr["sContent"].ToString(); } }
return model ;
}
public bool Add(GuestBookInfo model)
{
string sql = "insert into GuestBook (sTitle,sContent) values ('" + model.sTitle + "','" + model.sContent + "')";
int i = SqlHelper.ExecuteNonQuery(conn, CommandType.Text, sql);
if (i > )
{ return true; }
return false ;
}
public bool Delete(GuestBookInfo model)
{
string sql = "delete GuestBook where ID=" + model.ID.ToString();
int i = SqlHelper.ExecuteNonQuery(conn, CommandType.Text, sql);
if (i > )
{ return true; }
return false;
}
public bool Edit(GuestBookInfo model)
{
string sql = "update GuestBook set sTitle='" + model.sTitle + "',sContent='" + model.sContent + "' where ID=" + model.ID.ToString();
int i = SqlHelper.ExecuteNonQuery(conn, CommandType.Text, sql);
if (i > )
{ return true; }
return false;
}
其实:Controller依赖IRepository接口。
public class GuestBookController : System.Web.Mvc.Controller
{
IRepository<GuestBookInfo> inter = new BLL_GuestBook();
public ActionResult Index()
{
var models = inter.FindAllInfo();
return View("Index", models);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(GuestBookInfo model)
{ inter.Add(model );
return RedirectToAction("Index");
}
public ActionResult Create()
{
GuestBookInfo model = new GuestBookInfo();
return View(model );
}
public ActionResult Details(int id)
{ GuestBookInfo model=new GuestBookInfo ();
model .ID =id;
model =inter.GetInfo (model );
if (string .IsNullOrEmpty (model.sTitle ))
{ return View("NotFound"); }
else
{
return View("Details",model );
}
}
public ActionResult Edit(int id)
{
GuestBookInfo model = new GuestBookInfo();
model.ID = id;
model = inter.GetInfo(model);
if (string.IsNullOrEmpty(model.sTitle))
{ return View("NotFound"); }
else
{
return View("Edit", model);
}
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
GuestBookInfo model = new GuestBookInfo();
model.ID = id;
model = inter.GetInfo(model);
UpdateModel(model );
inter.Edit(model);
return RedirectToAction("Index");
}
public ActionResult Delete(int id)
{
GuestBookInfo model = new GuestBookInfo();
model.ID = id;
model = inter.GetInfo(model);
if (model == null)
return View("NotFound");
inter.Delete(model);
return RedirectToAction("Index");
} }
3:GuestBook.Model,MVC中的M。
4:GuestBook.RouteManager,路由管理项目,把路由处理从Global.asax中分离开。我们创建一个新类:MyMvcAppliation.cs
public class MyMvcAppliation:HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" }, // Parameter defaults
new string[] { "GuestBook.MVC.Controller" }
); } protected void Application_Start()
{
ControllerBuilder.Current.DefaultNamespaces.Add("GuestBook.MVC.Controller");
RegisterRoutes(RouteTable.Routes);
}
}
5:GuestBook.Data,数据处理工具类,例如SqlHelp等等。
6:GuestBook.DAL,数据处理层。
7:GuestBook.BLL,业务逻辑层。
8:GuestBook.MyInterface,相关接口,本项目中包含Repository模式中的接口类。
asp.net mvc(一) ----------简单封装成通用的List<T>集合的更多相关文章
- asp.net mvc 自定义pager封装与优化
asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...
- [ASP.net MVC] 将HTML转成PDF档案,使用iTextSharp套件的XMLWorkerHelper (附上解决显示中文问题)
原文:[ASP.net MVC] 将HTML转成PDF档案,使用iTextSharp套件的XMLWorkerHelper (附上解决显示中文问题) [ASP.net MVC] 将HTML转成PDF档案 ...
- asp.net mvc 实现简单的实时消息推送
因为项目需要,需要在网页上实现消息的推送.在百度上搜索了一下,发现实现网页上的消息推送,可以使用asp.net 中的SignalR类库,当然也可以使用H5的WebSocket Ajax的轮回.当然此 ...
- ASP.Net MVC——DotNetZip简单使用,解决文件压缩问题。
准备工作: 在vs工具栏中找到NuGet 下载DotNetZip 现在就可以使用DotNetZip强大的类库了,在这里我给出一些简单的使用. public ActionResult Export() ...
- ASP.NET MVC中简单使用Autofac
项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control.控制反转可以有效的降低类之间的相互依赖关系,增加架构的弹性,降低软件复杂度. 示例代码: IPro ...
- ASP.NET MVC 搭建简单网站 --1.前端页面布局和基本样式实现
学技术这件事儿本来就是学习现有的东西,然后变成自己的,本文当然也是借鉴的别人的东西,写出来作为一个对知识的巩固. 1.网站用的是MVC模式,新建一个MVC项目,建立一个APP1Controller, ...
- asp.net mvc Htmlhelper简单扩展
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- asp.net mvc 最简单身份验证 [Authorize]通过的标准
[Authorize] public ContentResult Index2() { return Content("验证通过了"); } 经常能够看到某个Controler下的 ...
- ASP.NET MVC 实现简单的登录
1.创建一个控制器 如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; ...
随机推荐
- 关于Cocos2d-x头文件的引用
cocos2d-x 3.10的G:\cocoshome\Cocos2d-x\cocos2d-x-3.10\extensions\GUI\CCControlExtension\CCScale9Sprit ...
- bson.errors.InvalidStringData: strings in documents must be valid UTF-8
场景: pymongo 查询数据库的时候报错. for gscode in GSList_StockPool_Mongo_MktStop: self._collection_flash.find({& ...
- e653. 写入段落文本
In order to change the font of the text, you need to supply an attributed string to the LineBreakMea ...
- (转)MFC鼠标单击消息拦截双击消息
如果LButtonDown和LButtonDblClk同时有实现的话 总会实现单击消息,在网上找解决方法,思想是在单击消息实现中取时间,计算两次单击事件的时间差 来回尝试修改,最后成这个样子,还算简单 ...
- 在linux上开发210的hdmi-servers输出
这段时间一直在研究hdmi-servers,因为友善对这个在是闭源的,所以由于兴趣的关系和工作的关系,决定自己写一个hdmi-servers. 在hdmi中,最关键的是弄清楚了Hdmi显示数据的怎么来 ...
- tiny210V2开发板hdmi输出到10.1寸LCD,无图像
tiny210V2开发板hdmi输出到10.1寸LCD,无图像... 用tiny210V2开发板的HDMI接口输出到的10.1寸LCD,LCD无任何现象.说明一下我的情况,我的10.1寸屏LCD是HD ...
- Android Studio怎样查看资源或者函数在哪些类中被引用
很多人在做完Keymap匹配到Eclispe快捷键后,发现查看资源或者函数在哪些地方被引用的快捷键"Ctrl+Shift+G"不灵 了.你选中某个函数后,使用这个快捷键.发现仅仅会 ...
- notepadd添加插件
markdown相关插件: https://www.cnblogs.com/tocy/p/npp-support-markdonw-extension.html
- oracle_存储过程_有参数_获取部门装置层级树
create or replace procedure P_UTIL_TREE(P_APPL_NAME in VARCHAR2, P_HIERARCHY_TYP in VARCHAR2, TREETY ...
- easyui------设置datagrid('getEditor')时焦点问题
代码: var dg = $(DataGrid.TableGridID); var row = { ID: "", UserName: "", Password ...