Я читаю книгу «Про ASP.NET MVC 2 от Стивена Сандерсона», и сейчас я нахожусь в главе 5. Великая книга до этого момента! Я последовал за книгой по созданию моего первого веб-приложения MVC: приложения SportsStore.MVC: в какой мере (должны) View и Model быть разделены?
В предисловии автор заявляет, это о Виде:
Просмотров простых шаблоны для преобразования модели представления в готовую кусок HTML. Им разрешено содержать базовую, логику только для представления, такую как возможность итерации по списку объектов для создания строки таблицы HTML для каждого объекта или возможности , чтобы скрыть или показать раздел страницы в соответствии с флаг на некотором объекте в модели представления, но ничего сложнее.
Однако, constructued этот простой веб-приложение, на странице 161 я вижу это выражение в \Views\Cart\Index.aspx
:
<td align="right">
<%: Model.Cart.ComputeTotalValue().ToString("c") %>
</td>
The View использует Model Binding, и эта модель имеет тип Store.WebUI.Models.CartIndexViewModel
public class CartIndexViewModel
{
public Cart Cart { get; set; }
public string ReturnUrl { get; set; }
}
Cart
класс:
namespace Store.Domain.Entities
{
public class Cart
{
private List<CartLine> lines = new List<CartLine>();
public IList<CartLine> Lines
{
get { return lines.AsReadOnly(); }
}
public decimal ComputeTotalValue()
{
return lines.Sum(l => l.Product.Price * l.Quantity);
}
}
}
Хорошо, так что инструкция «просто» выводит общее значение корзины. Но постойте ...
Когда в коде я вижу заявление как Model.Cart.ComputeXXX_YYY()
, как я могу определить «априори» (т.е. без проверки коды), выполняет ли этот метод простого расчета , который не меняет состояние модели?
А если это была сложная процедура, включающая модификацию и обновление различных объектов Модели?
В конце концов, имея возможность напрямую вызвать модель, «ленивый программист» может просто обойти логику контроллера. Каковы ограничения, с которыми MVC сталкивается с этой проблемой работы?
Есть ли какой-то момент, который я не понял или это правда?
Предлагаю посмотреть ViewModels. Они, надеюсь, избавятся от многих ваших проблем с помощью MVC. Они являются неотъемлемой частью этого, но, вероятно, более поздняя тема в моей книге. – JBeagle
Хорошо, я этого не понимаю. На самом деле CartIndexViewModel является ViewModel. Simplyfing, я хочу сказать, что в представлении «не должно быть позволено» напрямую обращаться к модели (или ViewModel), потому что вы не можете «априорно» знать, что делает функция ComputeXXX! – spiderman77
Извините, я упустил это. У меня НЕ было бы Cart.ComputeXXX на моей модели Cart, я бы переместил его в CartService.GetCartXXXValue (Корзина); В качестве примера. Затем вы можете использовать этот CartService в своем контроллере для создания ViewModels.С помощью этого метода ваш вид никогда не должен вызывать функции, которые меняют модель, поскольку данные на ней будут исключительно для отображения. – JBeagle