demoshop

demo, trying to be the best_

ASP.NET MVC 是一個新的玩意,在資料非常少的情況之下,想要知道用法可以直接k source code,也可以去參考別人寫的,demo因為在趕案子所以沒時間去看別人的code,就在上個星期五和保哥提到我自己覺得我的code好醜唷,保哥看了一下,也很不客氣的回我說,嗯滿醜的...但礙於和時間賽跑,所以我沒辦法自己改code所以就商請保哥假日的時候幫我改一下,順便我假日時回去k一下Scottgu放出來的eBook,demo在這提出我覺得很不錯的應用ViewModel。
 

demo學習ASP.NET MVC 是完全看官網的 Tutorials   所以他有提到的我才會用...因此如果我今天需要由Controller傳很多玩意給View那demo就會這樣寫

public ActionResult Index()
{
    ViewData["Message"] = "Welcome to ASP.NET MVC!";
    ViewData["UserLevel"] = 3;
    ViewData["IsMaster"] = true;
    ViewData["kind"] = (from a in database select a);
    ViewData["type"] = (from a in database2 select a);
    return View();
} 

ViewData是一個ViewDataDictionary 類別,他可以吃所有的東西,是Controller傳資料給View的一個利器。


那我們的View就會這樣

<h2><%= Html.Encode(ViewData["Message"]) %></h2>
 
    oox您好您的等級為<%=ViewData["UserLevel"]%>
    <%if ((bool)ViewData["IsMaster"]){%>
    您可以砍站ViewDataDictionary  
    <%  } else{%>
    你不夠格啦
    <%{%>
 
<%foreach (var item in (IEnumerable)ViewData["kind"] )  {%>
…     
<%} %>
 
    <%foreach (var item in (IEnumerable)ViewData["type"] )  {%>
…     
<%} %> 

很醜吧,醜其實不是它的重點,重點是物件都不是強型別,所以無法在編譯的時候發生錯誤,demo有過幾次因為手誤打錯字,找了很久找不到錯誤,後來才發現了是因為錯字的原因,白白浪費很多時間。因此我們要盡量的使用強型別來撰寫程式碼就是這個原因。

 

如果以上的Code我們改用ViewModel會有什麼改變呢?

 

先在Controller上新增欄位

public class MyViewModel
{
    public string Message { get; set; }
    public int UserLevel { get; set; }
    public bool IsMaster { get; set; }
    public dbKind kind { get; set; }
    public dbType type { get; set; }
} 

然後ActionResult變成這樣

return View(new MyViewModel()
            {
                Message = "Welcome to ASP.NET MVC!",
                UserLevel = 3,
                IsMaster = true,
                kind = (from a in database select a),
                type = (from a in database select a),
            }); 

View先來繼承此類別

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Controllers.MyViewModel>" %>

<h2><%= Html.Encode(Model.Message) %></h2>
 
    oox您好您的等級為<%=Model.UserLevel%>
    <%if (Model.IsMaster)
      {%>
    您可以砍站ViewDataDictionary  
    <%  }
      else
      {%>
    你不夠格啦
    <%}%>
 
<%foreach (var item in Model.type ) {%>
…     
<%} %>
 
    <%foreach (var item in Model.kind){%>
…     
<%} %> 

看到了嗎?全部變成了強型別不但可以用點的點出來而且不會錯,重點還有一個,就是他徹底的解決了demo之前想在一頁View撈很多個資料表資料時的麻煩,如果你有在學ASP.NET MVC這篇對你應該多少會有幫助!! 共同學習成長吧

回應討論