Spiga

ASP.NET MVC Preview 2 小例子

2008-03-14 13:14 by Dean C, 3372 visits, 收藏, 编辑

自从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 = OFFON [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,不过仍有些问题还没有解决,以后有时间的话再来个修改版吧。


  • Add your comment

    12 条回复

    1. #1楼 重典      2008-03-14 13:18
      ^^不错
       回复 引用 查看   
    2. #2楼[楼主] Shawn Ji      2008-03-14 13:21
      @重典
      o(∩_∩)o
       回复 引用 查看   
    3. #3楼 Anytao      2008-03-14 16:13
      路过,支持,喜欢有实践的东西
       回复 引用 查看   
    4. #4楼 北京SEO网站优化[未注册用户]2008-03-14 22:23
      问下,文章最后的添加在线收藏的代码是哪里找到的?
      能给个不?
       回复 引用   
    5. #5楼 隨風.NET      2008-03-15 11:09
      MVC 可以分层吗 把mvc分别放到不同的层中
       回复 引用 查看   
    6. #6楼[楼主] Shawn Ji      2008-03-17 09:18
      @北京SEO网站优化
      http://addthis.com
      挺好玩的
       回复 引用 查看   
    7. #7楼[楼主] Shawn Ji      2008-03-17 09:20
      @隨風.NET
      我所说的分层不是将MVC割裂开来,而是将业务逻辑,数据模型,数据访问等东西分离出来。
       回复 引用 查看   
    8. #8楼 郭荣维[未注册用户]2008-04-09 22:17
      楼主,辛苦了。
      我也在做这方面的事情。碰到了一些问题。希望可以和楼主一起探讨。
      比如:后台,如果想用webform模式,或开源的在线编辑器要在mvc模式下用等。
      QQ:759922422
       回复 引用   
    9. #9楼[楼主] Shawn Ji      2008-04-11 14:55
      @郭荣维
      抱歉,在线编辑器,这些东西我还没研究过~
       回复 引用 查看   
    10. #10楼 孙立兴[未注册用户]2008-04-28 20:52
      看来对这种语言有一定见解了
      了不起
       回复 引用