1. 程式人生 > >【MVC框架】——View和Controller之間的傳值

【MVC框架】——View和Controller之間的傳值

    在MVC中,Controller執行一個可以說是路由功能,它通過View傳過來的資料,來決定應該呼叫哪一個Model,同樣會把Model處理完的資料傳給View,所以就總是涉及到Controller和View的傳值,那麼它們之間是怎麼傳值的呢?

Controller向View傳值

1、使用ViewBag

Controller

<span style="font-family:KaiTi_GB2312;font-size:18px;">public ActionResult Index()
{
     ViewBag.Message = "歡迎使用 ASP.NET MVC!";

     return View();
}</span>

View

<span style="font-family:KaiTi_GB2312;font-size:18px;">@{
    ViewBag.Title = "主頁";
}

<h2>@ViewBag.Message</h2>
<p>
    若要了解有關 ASP.NET MVC 的更多資訊,請訪問 <a href="http://asp.net/mvc" title="ASP.NET MVC 網站">http://asp.net/mvc</a>。
</p></span>
ViewBag傳過來的Message資訊將會傳遞給<h2>@ViewBag.Message</h2>,所實現的效果就是

                                

2、使用ViewData

Controller

<span style="font-family:KaiTi_GB2312;font-size:18px;">public ActionResult Index()    
{    
    ViewData["Message"] = "Welcome to ASP.NET MVC!";    
    return View();    
} </span>

View

<span style="font-family:KaiTi_GB2312;font-size:18px;">
<h2><%=Html.Encode(ViewData["Message"])%></h2>
<p>
    若要了解有關 ASP.NET MVC 的更多資訊,請訪問 <a href="http://asp.net/mvc" title="ASP.NET MVC 網站">http://asp.net/mvc</a>。
</p></span>
所實現的效果是相同的。

3、使用TempData

Controller

<span style="font-family:KaiTi_GB2312;font-size:18px;">public ActionResult Index()    
{    
    TempData["Message"] = "Welcome to ASP.NET MVC!";    
    return View();    
} </span>

View

<span style="font-family:KaiTi_GB2312;font-size:18px;">
<h2><%=Html.Encode(TempData["Message"])%></h2>
<p>
    若要了解有關 ASP.NET MVC 的更多資訊,請訪問 <a href="http://asp.net/mvc" title="ASP.NET MVC 網站">http://asp.net/mvc</a>。
</p></span>

4、使用Model

Controller

<span style="font-family:KaiTi_GB2312;font-size:18px;">public ActionResult ModelDemo()      
{      
    User u= new User() { UserName="li", Password="abcde" };      
    return View(u);      
}   </span>
View
<span style="font-family:KaiTi_GB2312;font-size:18px;"><p>      
   <%User u = (User)ViewData.Model;%>      
   UserName:       
   <%= Html.Encode(u.UserName) %>      
</p>      
<p>      
    Password:       
    <%= Html.Encode(u.Password) %>      
 </p>    </span>
下面介紹四種方法的不同點:

    ViewData是Key/Value字典集合,在MVC1中就有了,ViewData傳值比ViewBag要快;ViewBag是dynamic型別物件,從MVC3才開始出現,比ViewData傳值慢,但是可讀性好。

    ViewData只能用於當前Action中,而TempData類似於Session,可以跨Action進行訪問,一般用於儲存錯誤資訊。

    Model傳遞強型別,所以在建立檢視時,需要建立強檢視。

View向Controller傳值

1、通過Request.Form讀取表單資料

View

<span style="font-family:KaiTi_GB2312;font-size:18px;"><% using (Html.BeginForm("ActionName", "ControllerName"))

       { %>

    UserName:<% Html.TextBox("UserName"); %>

    Password:<% Html.TextBox("Password"); %>

<%} %>
</span>

Controller
<span style="font-family:KaiTi_GB2312;font-size:18px;">[AcceptVerbs(HttpVerbs.Post)]

        public ActionResult ActionName()

        { 

            string username = Request.Form["UserName"];

            string password = Request.Form["Password"];

            return View();

}
</span>

2、通過FormCollection讀取表單資料

View

<span style="font-family:KaiTi_GB2312;font-size:18px;"><% using (Html.BeginForm("ActionName", "ControllerName"))

       { %>

    UserName:<% Html.TextBox("UserName"); %>

    Password:<% Html.TextBox("Password"); %>

<%} %></span>

Controller

<span style="font-family:KaiTi_GB2312;font-size:18px;">[AcceptVerbs(HttpVerbs.Post)]

        public ActionResult ActionName(FormCollection formCollection)

        {

            string username = formCollection["UserName"];

            string password = formCollection["Password"];

            return View();

        }
</span>

總結

    頁面傳值會用到各種方法,那麼頁面和控制器間的傳值同樣會有很多方法。View和Controller傳值是不可避免的,熟練掌握它們之間的傳值方法,有利於更流利的開發。