我正處於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 []語法將適合相同)。另一方面,您將視圖與模型緊密耦合,以便模型的每一個細微變化都會導致鏈接視圖發生級聯變化。
我明白你的觀點......然而這個例子取自MVC的史蒂文桑德森之書。這是本書中介紹的MVC的第一個例子,作者明確指出這是MVC(不是MVVM)。 – spiderman77
嗯,我猜他在某些方面是正確的 - 但是,這個架構幾乎是一樣的。 – James