***** 该内容需会员回复才可浏览 *****
自从ASP.NET MVC Framework出现之后,就比较感兴趣,但却一直也没时间仔细的研究,前些日子ASP.NET MVC Preview 2发布后,有空的时候也尝试着玩一下。

今天简单地完成个小东西,类似个Chatroom。 功能很简单,用昵称和电邮登录,并用此信息发送信息。






先搞个表:
USE
[TalkDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE
TABLE
[dbo].[Chatroom](
   
[CharId]
[int]
NOT
NULL,
   
[NickName]
[nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT
NULL,
   
[EMail]
[nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT
NULL,
   
[Posttime]
[datetime]
NULL,
   
[Contents]
[nvarchar](500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT
[PK_CHATROOM]
PRIMARY
KEY
CLUSTERED
(
   
[CharId]
ASC
)
WITH (PAD_INDEX  =
OFF, IGNORE_DUP_KEY =
OFF) ON
[PRIMARY]
)
ON
[PRIMARY]


研习过MVC的大概都看过scottgu大牛关于ASP.NET MVC Framework的一套介绍:
ASP.NET MVC 框架 简介 ASP.NET MVC 教程 (第一部分) ASP.NET MVC 教程 (第二部分: URL路径选择) ASP.NET MVC 教程 (第三部分: 把ViewData从控制器传到视图) ASP.NET MVC 教程 (第四部分: 处理表单编辑和提交场景)

不再赘述了,其实我也说不明白 :)~ 相比上一个版本,觉得比较Cool的地方是对模板标签的强化,或者说是Easy化。比如

再如

这样可以避免一些硬代码。其中Index(),About(),和CheckIn()都是Controller中的方法,尤其是对Form的使用,真是简便极了,Controller获取页面数据可以             UserItem UserItem =
new UserItem();

           
// 获取数据
            BindingHelperExtensions.UpdateFrom(UserItem, Request.Form);

但这些都需要一个简单的引用Controller:
<%@ Import Namespace="Shawn.Chatroom.Controllers"
%>

对于Controller中Action之间的多参数传值,有几种方法:比如在HomeController控制下的登录页面Check In成功之后,需要转向ChatroomController控制的Chatroom页面,并需要告知ChatroomController两个参数UserItem.NickName 和 UserItem.EMail

public
void CheckIn()
       
{
            UserItem UserItem
=
new UserItem();

           
// TODO.

           
if (UserItem.IsSuccessful)
           
{
               
// 转向Chatroom页面,传递UserItem.NickName 和 UserItem.EMail
                RedirectToAction(new RouteValueDictionary(new
            }

        }

在进行RedirectToAction语句之前如何为传值作准备
1.
Register Routes
在Global中配置
            routes.Add(new Route("{controller}/{action}/{nickName}/{email}", new MvcRouteHandler())
           
{
                Defaults
=
new RouteValueDictionary(
               
new
{ controller =
"Charroom", action =
"ChatroomIndex", nickName =
"", email =
"" }),
            }
);

HomeController

public
void CheckIn()
       
{
            UserItem UserItem
=
new UserItem();

           
// TODO.

           
if (UserItem.IsSuccessful)
           
{
                RedirectToAction(
new RouteValueDictionary(new
               
{
                    controller
=
"Chatroom", action =
"ChatroomIndex", nickName = UserItem.NickName, email = UserItem.EMail.Replace(".","_dot_")
                }
));
            }

        }


ChatroomController
public
void ChatroomIndex(string nickName, string email)
       
{
            ChatList chatList
=
new ChatList();

            chatList.UserNickName
= nickName;
            chatList.UserEmail
= email.Replace("_dot_", ".");
        }


2.使用TempData
HomeController
public
void CheckIn()
       
{
            UserItem UserItem
=
new UserItem();

           
// TODO.

           
if (UserItem.IsSuccessful)
           
{
               
// TempData方式
                TempData["UserItem"] = UserItem;
                RedirectToAction(
new RouteValueDictionary(new
{ controller =
"Chatroom", action =
"ChatroomIndex" }));
            }

        }

ChatroomController

public
void ChatroomIndex()
       
{
            ChatList chatList
=
new ChatList();


           
// TempData方式
            UserItem userItem = (UserItem)TempData["UserItem"];
            chatList.UserNickName
= userItem.NickName;
            chatList.UserEmail
= userItem.EMail;
        }

(见到TempData会使我想起WebForm上使用ViewState存储些东西,虽然二者并不相同。)

对于Controller中Action之间的多参数传值,开始一直比较苦恼,但今天找到了解决的办法,还是靠了园子中乱世重典的帮忙,再此感谢。

代码下载
Download Shawn Chatroom

当然,这只是个简单得不能再简单的东西,很多没有完善的地方,比如界面美观,比如分页,比如实时更新Chat列表,比如方法的优化,比如分层等等都没有实现,另外这次使用的是LINQ to SQL,其实我是打算使用ADO.NET Entity Framework,不过仍有些问题还没有解决,以后有时间的话再来个修改版吧。