引子
书接上文,上次我说到Mvc3开发环境的搭建,及MVC3程序的运行原理,这次着重讨论一下,MVC3+Spring.net框架的整合应用,Spring.net作为一套成熟的企业级应用框架,一直很爱开发者的喜爱。Spring.net不仅可以应用于传统的WebForm程序,在MVC程序中也有着举足轻重的地位。
添加Spring引用
Common.Logging、Spring.Core、Spring.Web,Spring.Web.Mvc
修改web.config
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc"/>
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="~/Config/Controller.xml"/>
</context>
</spring>
<system.web>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<!--很重要-->
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web" />
</httpModules>
</system.web>
用Spring配置Controller文件
<objects xmlns="http://www.springframework.net">
<object id="Home" type="SpringMvcApplication1.Controllers.HomeController, SpringMvcApplication1" singleton="false">
<property name="Content" value="Spring.NET1.3.1的ASP.NET MVC依赖注入"/>
</object>
</objects>
注册SpringControllerFactory
在Global.asax文件中重新注册Controller对象工厂,让Spring代替MVC来管理Controller对象。不要采用spring.net官方的SpringMvcApplication类,这个类中包含很多原本global.ascx.cs中的代码,如果让global.ascx.cs继承SpringMvcApplication类,那么还需要调整global.ascx.cs类中的代码,防止与父类代码重复和冲突,实际上要在Controller中使用spring进行IoC,只需要注册ControllerFactory的实现类为SpringControllerFactory就可以了。
见证奇迹的时刻
结语
教程虽然仅仅是第一篇入门文章, 但是不是觉得已经会用Spring配置管理ASP.NET MVC了?在后续文章中,我将对Spring管理MVC的各种细节,MVC异常处理过滤器的应用.希望大家喜欢本系列文章!
本文链接
C#字符串连接常用的四种方式:StringBuilder、+、string.Format、List<string>。
1.+的方式
string sql = "update tableName set int1=" + int1.ToString() + ",int2=" + int2.ToString() + ",int3=" + int3.ToString() + " where id=" + id.ToString();
编译器会优化为:
string sql = string.Concat(new string[] { "update tableName set int1=", int1.ToString(), ",int2=", int2.ToString(), ",int3=", int3.ToString(), " where id=", id.ToString() });
下面是string.Concat的实现:
public static string Concat(params string[] values){
int totalLength = 0;
if (values == null)
{
throw new ArgumentNullException("values");
}
string[] strArray = new string[values.Length];
for (int i = 0; i < values.Length; i++)
{
string str = values[i];
strArray[i] = (str == null) ? Empty : str;
totalLength += strArray[i].Length;
if (totalLength < 0)
{
throw new OutOfMemoryException();
}
}
return ConcatArray(strArray, totalLength);
}
private static string ConcatArray(string[] values, int totalLength)
{
string dest = FastAllocateString(totalLength);
int destPos = 0;
for (int i = 0; i < values.Length; i++)
{
FillStringChecked(dest, destPos, values[i]);
destPos += values[i].Length;
}
return dest;
}
private static unsafe void FillStringChecked(string dest, int destPos, string src)
{
int length = src.Length;
if
一、ViewData与TempData属性来向View页传递对象
上文中已经提到,使用ViewData可以将数据由Controller传递到View
在前文中我们建立了EiceController类
在本文的示例中我们将这个Controller改一下
{
public ActionResult Index()
{
ViewData["ViewData"] = "在这里显示ViewData";
TempData["TempData"] = "在这里显示TempData";
return View();
}
public ActionResult Index2()
{
return View("Index");
//这里指定了规定显示的View文件即Eice目录下的Index.aspx
}
}
我们将Index的参数移除,并提供了ViewData和TempData的赋值
在Views/Eice/Index.aspx这个View中我们写以下代码
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
1:<%=ViewData["ViewData"]%><br />
2:<%=TempData["TempData"]%>
</asp:Content>
注意上面的1.2不是行号,是我写的。
接下来我们运行工程
访问http://localhost/Eice/Index
可以看到运行得到以下
2.在这里显示TempData
再访问http://localhost/Eice/Index2
显示结果为
2.在这里显示TempData
这里1显示是的ViewData中的内容,2为TempData传递的内容
我们可以看到ViewData只能在当前Action中有效
但是TempData可以类似于Session一样到其它页面仍然存在,但只限一页的访问(类似于Monorail中的Flash)
TempData一般用于临时的缓存内容或抛出错误页面时传递错误信息。
二、通过ViewData.Model来传递对象
我们先建立一个Model:EiceIndexModel.cs。
public class EiceIndexModel{
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 性别
/// </summary>
public bool Sex { get; set; }
}
之后我们建立一个新的Action:Index3
public ActionResult Index3(){var m = new EiceIndexModel
{
Name = "邹健",
Sex = true
};
return View(m);
}
我们下面为Index3建立View文件,仍然是在Index3上点击右键AddView
于是自动生成了一个View文件,我们运行看结果:
如果我们想要显示其它的文件我们应该怎么办呢?
本文链接