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 重典 阅读(2937) 评论(18)  编辑 收藏 所属分类: 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了 这个时候不能等都做好了再上传吧