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>
Что мне кажется странным, так это то, что представление тесно связано с моделью: в ней используется такой код Model.WillAttend
ecc... Так что же произойдет, если в будущем Модель изменится? Мне нужно изменить все фрагменты в этом конкретном представлении (но, возможно, также во многих других представлениях...) Это тесная связь или я здесь упускаю смысл?
РЕДАКТИРОВАТЬ
В книге автор указывает, что этот полезный механизм
Привязка модели
Учитывая, что метод [public ViewResult RsvpForm(GuestResponse guestResp)] вызывается через HTTP-запрос, и что GuestResponse является типом.NET, который совершенно неизвестен HTTP, как HTTP-запрос может предоставить экземпляр GuestResponse? Ответ - привязка модели, чрезвычайно полезная функция ASP.NET MVC, благодаря которой входящие данные автоматически анализируются и используются для заполнения параметров метода действия путем сопоставления входящих пар ключ / значение с именами свойств нужного типа.NET. Этот мощный, настраиваемый механизм устраняет большую часть сложностей, связанных с обработкой HTTP-запросов, позволяя вам работать в основном в строго типизированных объектах.NET, а не на низкоуровневом переключении со словарями Request.Form[] и Request.QueryString[], как часто необходимо в веб-формах. Поскольку элементы управления вводом, определенные в RsvpForm.aspx, отображаются с именами, соответствующими именам свойств в GuestResponse, платформа предоставит вашему методу действия экземпляр GuestResponse, уже полностью заполненный данными, введенными пользователем в форму.
Мои два цента: но так, этот механизм дает вам преимущество строго типизированных классов внутри View (что, однако, действительно полезно благодаря возможности IntelliSense Visual Studio, в противном случае, на мой взгляд, синтаксис Request.Form[] будет соответствовать так же). С другой стороны, вы тесно связываете представление с моделью, так что каждое крошечное изменение в модели приведет к каскаду изменений в связанных представлениях.
1 ответ
Это тесная связь, или я здесь упускаю смысл?
Да, это тесная связь, и точка, которую вы, возможно, упускаете, - это не M
в MVC это другой тип модели, называемый моделью представления, и он должен быть адаптирован для конкретного представления, чтобы иметь смысл, что он связан.
Он обычно известен как MVVM, производная от MVC, которая вводит понятие моделей представлений, чтобы отделить вашу фактическую модель от представления.