2

我正處於MVC的第一步。MVC視圖模型解耦

在我的第一個例子,我有一個模型,如下所示:

public class GuestResponse 
{ 
    [Required(ErrorMessage = "Please enter your name")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Please enter your email")] 
    [RegularExpression(".+\\@.+\\..+", ErrorMessage = "Please enter a valid email address")] 
    public string Email { get; set; } 

    public string Phone { get; set; } 

    [Required(ErrorMessage = "Please specify whether you'll attend")] 
    public bool? WillAttend { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ViewResult Index() 
    { 
     ViewData["greeting"] = (DateTime.Now.Hour < 12 ? "Good morning" : "Good afternoon"); 
     return View(); 
    } 

    [HttpGet] 
    public ViewResult RsvpForm() 
    { 
     return this.View(); 
    } 

    [HttpPost] 
    public ViewResult RsvpForm(GuestResponse guestResp) 
    { 
     if (ModelState.IsValid) 
     { 
      return this.View("Thanks", guestResp); 
     } 
     else 
     { 
      return this.View(); 
     } 
    } 
} 

和查看:

<body> 
<div> 
    <h1> 
     Thank you, 
     <%: Model.Name %>.</h1> 
    <p> 
     <% if (Model.WillAttend == true) 
      { %> 
     It's great that you're coming. The drinks are already in 
     the fridge! 
     <% } 
      else 
      { %> 
     Sorry to hear you can't make it, but thanks for letting 
     us know. 
     <% } %> 
    </p> 
</div> 

什麼似乎很奇怪對我來說,就是那個Vi ew與模型緊密耦合:它使用像Model.WillAttend ecc這樣的代碼......那麼如果在未來的模型更改時會發生什麼?我應該改變這個特定的視圖內的所有片段(但也可能在許多其他視圖中...) 這是緊耦合還是我錯過了這裏的觀點?

編輯

在這本書中作者指出,這種有用的機制是

模型綁定

鑑於方法[公衆的ViewResult RsvpForm(GuestResponse guestResp) ]正在通過HTTP請求調用 ,並且GuestResponse是HTTP完全未知的.NET類型, HTTP請求如何可能提供GuestResponse實例?答案是模型綁定,ASP.NET MVC的一個非常有用的功能,通過傳入的鍵/值對與所需的.NET類型的屬性 的名稱匹配,傳入數據被自動分析並用於 填充操作方法參數。 這個強大的可自定義機制消除了很多與處理HTTP請求相關的單調乏味的管道,讓您主要在強類型的.NET對象方面工作,而不是在使用Request.Form []和Request.QueryString []方法的低級別操作方面工作而不是 。字典,在Web窗體中經常需要 。由於在RsvpForm.aspx中定義的輸入控件的名稱爲 ,與GuestResponse上屬性的名稱相對應,框架將向您的動作 方法提供一個GuestResponse實例,該實例已經完全填充了用戶輸入到 表單中的任何數據。

我的兩分錢:不過如此,這個機制給您的視圖內強類型類(其中,但是,是真正有用的感謝到Visual Studio 智能感知功能的優勢,否則在我看來也請求。 Form []語法將適合相同)。另一方面,您將視圖與模型緊密耦合,以便模型的每一個細微變化都會導致鏈接視圖發生級聯變化。

回答

2

這是緊耦合還是我在這裏錯過了點

是的,它是緊耦合的,你也許缺少一點是 - 這不是MVC中的M,這是一個不同類型的的模型稱爲視圖模型,它應該是針對特定視圖定製的,所以它是合理的,它是耦合的。

它通常被稱爲MVVM,MVC的推導引入了視圖模型的概念,從視圖中分離您的實際模型。

+0

我明白你的觀點......然而這個例子取自MVC的史蒂文桑德森之書。這是本書中介紹的MVC的第一個例子,作者明確指出這是MVC(不是MVVM)。 – spiderman77

+0

嗯,我猜他在某些方面是正確的 - 但是,這個架構幾乎是一樣的。 – James