Asp.net Mvc Framework 九 (View与Controller交互)

这一回为避免写第八节时那种情况再次出现,我改用Wps写了,如果复制过去格式有问题讲大家见谅

--邹健

本节所有示例都是讲解登录提交表单的过程

为了本课能更好讲解我们先建立一个账号的Model

namespace  MvcApplication4.Models

{

  public   class   Account

  {

    string  _username;

    public   string  Username {

      get  {  return  _username; }

      set  { _username =  value ; }

    }

    string  _password;

    public   string  Password {

      get  {  return  _password; }

      set  { _password =  value ; }

    }

  }

}

一. 使用我们Asp时代的老朋友

我们建立一个HomeController,之后在其中加一个Index的Action

    public   void  Index() {

      RenderView( "Index" );

    }

是用于显示Index这个View的(Index.aspx):

这是提交表单的

     < form   method ="post"   action =" <% = Url.Action("save")  %> ">

     <% = Html.TextBox( "username" %>

     <% = Html.TextBox( "password" %>

     <% = Html.SubmitButton( "登录" %>

     </ form >

大家可以看到在这个View中form的Action为save

于是我们还需要一个叫save的Action用于接收表单:

    public   void  save (){

      ViewData[ "username" ] = Request.Form[ "username" ];

      ViewData[ "password" ] = Request.Form[ "password" ];

      RenderView( "Result" );

    }

最后我们将结果显示在Result.aspx这个View中:

这是用于接收结果的

    <% = ViewData [ "username" %>

    <% = ViewData [ "password" %>

大家都看到了,我们在Save中使用了我们的老朋友Request.Form来接收了表单

二. 其实Asp.netMVC为我们提供了更好的方法

是什么方法呢?

那就是我觉得不错的一方法 ReadFromRequest 它可以接收Form和QueryString

看以下save这个Action的代码

    public   void  save (){

      ViewData[ "username" ] =  this .ReadFromRequest( "username" );

      ViewData[ "password" ] =  this .ReadFromRequest( "password" );

        RenderView( "Result" );

    }

可以实现上面一样的功能

三. 我们可以用"参数"

前面我们提到了参数来接收的功能

    public   void  save ( string  username, string  password){

      ViewData[ "username" ] = username;

      ViewData[ "password" ] = password;

        RenderView( "Result" );

    }

一切OK

四. 到激动人心的地方了我们使用绑定功能

在Monorail中我们有这样的功能

public void save([DataBind("account")] Account account) ;可以实现将一个对象与表单绑定

当然Asp.net MVC中也应该有

我们将View改成:

 这是提交表单的

     < form   method ="post"   action =" <% = Url.Action("save")  %> ">

     <% = Html.TextBox( " Account .username" %>

     <% = Html.TextBox( " Account .password" ) %>

     <% = Html.SubmitButton( "登录" %>

     </ form >

而Save这个Action中写如下代码:

    public   void  save() {

      Account  user =  new   Account ();

      BindingHelperExtensions .UpdateFrom(user, Request.Form,  " Account " );

      ViewData[ "username" ] = user.Username;

      ViewData[ "password" ] = user.Password;

      RenderView( "Result" );

    }

呵呵,仍然可以输

BindingHelperExtensions .UpdateFrom 让我们将从表单中以对象方式传递着数据

当然这个对象如果绑定的为Dlinq的对象就更加方便应用了

也可以通过这种方式绑定

View:

 这是提交表单的

     < form   method ="post"   action =" <% = Url.Action("save")  %> ">

     <% = Html.TextBox( "username" ) %>

     <% = Html.TextBox( "password" ) %>

     <% = Html.SubmitButton( "登录" %>

     </ form >

Action:

public   void  save() {

      Account  user =  new   Account ();

      BindingHelperExtensions .UpdateFrom(user, Request.Form);

      ViewData[ "username" ] = user.Username;

      ViewData[ "password" ] = user.Password;

      RenderView( "Result" );

    }

也可以实现

这里用了 BindingHelperExtensions .UpdateFrom(user, Request.Form); 来实现绑定

这个用于表单中只有一个对象的情况,前一个则可适用于多个对象在同一表彰中的情况


本节示例MVC9.rar

Asp.net Mvc Framework 系列
posted @ 2008-03-14 13:00 重典 阅读(4144) 评论(35)  编辑 收藏 所属分类: Microsoft MVC

  回复  引用  查看    
#1楼 [楼主]2008-03-14 13:01 | 重典      
汗了,标题都打错了,幸好及时改过
  回复  引用  查看    
#2楼 2008-03-14 14:36 | miao~      
速度好快啊..一天一篇啊..哈哈~~
  回复  引用  查看    
#3楼 2008-03-14 14:45 | kkun      
[这一系列的全部看完了,就是不知道啥时候出中文版MVC2
  回复  引用  查看    
#4楼 [楼主]2008-03-14 17:09 | 重典      
@kkun
中文应该是不会出的
  回复  引用  查看    
#5楼 [楼主]2008-03-14 17:10 | 重典      
@miao~
谢谢支持^^
  回复  引用  查看    
#6楼 2008-03-15 11:15 | 隨風.NET      
MVC 可以分层吗 把mvc分别放到不同的层中
  回复  引用  查看    
#7楼 [楼主]2008-03-15 12:10 | 重典      
@隨風.NET
本身已经分开了,M V C分别自己控制,相互之间尽量减少耦合
  回复  引用  查看    
#8楼 2008-03-16 16:38 | 隨風.NET      
我的意思是能否放到不同的工程中 这样能生成不同的DLL
这样的话可以为V层中每一个目录生成一个单独的DLL 各个之间互不干扰
  回复  引用  查看    
#9楼 [楼主]2008-03-16 19:08 | 重典      
不是,View不一定生Dll它有可能是解释的
  回复  引用  查看    
#10楼 2008-03-18 08:19 | 隨風.NET      
我的意思是V对应的 C 可以按V的不同目录生成不同的DLL 不知道可否
  回复  引用  查看    
#11楼 [楼主]2008-03-18 12:23 | 重典      
@隨風.NET
可以的,不过没有必要吧

  回复  引用  查看    
#12楼 2008-03-18 14:58 | 隨風.NET      
@重典
很有必要哦 比如一个文件夹是关于会员的 另外一个文件夹是关于新闻的
现在要在会员里增加些功能 而同时新闻里也在修改
这个时候就必须2个都改好才能生成一个DLL 这样的话就麻烦了 必须2个同时好
如果分开就好了
  回复  引用  查看    
#13楼 [楼主]2008-03-18 15:06 | 重典      
@隨風.NET
无论是更改一个或两个程序集
IIS都是要重新编译网站的
所以我感觉应该是没有区别

只有从可扩展性方面考虑才有分开的必要
  回复  引用  查看    
#14楼 2008-03-19 10:50 | 隨風.NET      
重新编译网站是可以接受的哦 有时候就是一个功能还没做完 但是另外一个功能已经ok了 这个时候不能等都做好了再上传吧
  回复  引用  查看    
#15楼 2008-07-14 13:55 | 云の世界      
有一个场景,不知道如何用mvc实现
比如一个新闻系统,首页把各个新闻分类里的新闻标题的最新N条读出来,
在webform下,我把首页新闻列表封装成ascx,并且自定义了两个属性:新闻类别和显示条数。这种情况下,首页aspx里只要有显示列表的地方,设置一下这两个属性就OK了。也就是说,改首页aspx,就可以最终只取需要的数据。
而在mvc下,控制取数据部分和页面彻底分离,上面的逻辑,既要让美工去修改页面,也要程序员修改controler?
  回复  引用  查看    
#16楼 [楼主]2008-07-14 14:47 | 重典      
用户组件,
Html.RenderComponent方法
  回复  引用  查看    
#17楼 [楼主]2008-07-14 14:47 | 重典      
@云の世界
用户组件,
Html.RenderComponent方法
  回复  引用  查看    
#18楼 2008-07-16 09:33 | 云の世界      
谢谢,了解一下先。
  回复  引用  查看    
#19楼 2008-08-31 02:06 | 勇敢的兽      
重典大哥,用MVC框架是不是表明就不能用DataGrid显示列表了?

分页得在存储过程中实现,然后用foreach或者Repeater在页面中显示??
  回复  引用  查看    
#20楼 [楼主]2008-08-31 10:13 | 重典      
@勇敢的兽
尽量不要用<asp:的控件

如果要显示数据这里有一种解决方案
http://www.codeplex.com/MVCContrib
它有一个GridView

  回复  引用  查看    
#21楼 2008-09-01 10:22 | 勇敢的兽      
啊,哈哈,改blog的风格了啊,脚印一个

重典推荐的MVCContrib很不错,很多扩展,谢谢

可不可以抽时间给我们讲讲ASP.NET MVC模型中和数据库的关联啊,比如存储过程的调用啊之类的
  回复  引用  查看    
#22楼 2008-09-01 10:23 | 勇敢的兽      
为什么回复的时候只有左边的引号【“】 没有了右边的引号【”】 呢??
  回复  引用  查看    
#23楼 [楼主]2008-09-01 10:32 | 重典      
@勇敢的兽
这个就和其它的框架中一样了
MVC主要是这三部分的关系
  回复  引用  查看    
#24楼 [楼主]2008-09-01 10:32 | 重典      
@勇敢的兽
不知道哈哈
  回复  引用  查看    
#25楼 2008-09-01 11:36 | 勇敢的兽      
ASP.NET MVC中大量用到LinQ,访问数据库的逻辑就直接写在Controls中,很少看到使用存储过程的例子,调用存储过程的程序块应该放在什么地方呢?
  回复  引用  查看    
#26楼 [楼主]2008-09-01 11:42 | 重典      
我是这样做的
Models中有一个部分专门处理存储过程

Controller调用之后将之交与View

就是这样
  回复  引用  查看    
#27楼 2008-09-01 11:44 | 勇敢的兽      
重点大哥,如果我页面中有一个DownDropList ,数据是从数据库里面调用的,每次刷新页面或者post页面后 都需要重新从数据库里面取一次吗??
  回复  引用  查看    
#28楼 2008-09-01 11:46 | 勇敢的兽      
你的意思是Models中有一个方法GetXXXList()

然后存储过程就放在GetXXXList()里面是吧,嗯。明白了

呃,不要怪我问题多,我比较愚钝哈,难得遇到你这样的明灯
  回复  引用  查看    
#29楼 [楼主]2008-09-01 12:06 | 重典      
@勇敢的兽
正常不加任何修饰的写的话是这样,不过你可以缓存
  回复  引用  查看    
#30楼 2008-09-06 13:02 | 烟头上的探戈      
看来 很入门 不错!支持!
  回复  引用  查看    
#31楼 [楼主]2008-09-06 13:10 | 重典      
@烟头上的探戈
谢谢支持,有问题的话直接回复就可以了,能的话我尽量