Asp.net Mvc Framework 九 (View與Controller互動)
這一回為避免寫第八節時那種情況再次出現,我改用Wps寫了,如果複製過去格式有問題講大家見諒
--鄒健
本節所有示例都是講解登入提交表單的過程
為了本課能更好講解我們先建立一個賬號的Model
namespace MvcApplication4.Models
{
public class Account
{
string _username;
public string Username {
get { return
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.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); 來實現繫結
這個用於表單中只有一個物件的情況,前一個則可適用於多個物件在同一表彰中的情況