2013-10-09 3 views
0

Я читаю книгу «Про 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 сталкивается с этой проблемой работы?

Есть ли какой-то момент, который я не понял или это правда?

+0

Предлагаю посмотреть ViewModels. Они, надеюсь, избавятся от многих ваших проблем с помощью MVC. Они являются неотъемлемой частью этого, но, вероятно, более поздняя тема в моей книге. – JBeagle

+1

Хорошо, я этого не понимаю. На самом деле CartIndexViewModel является ViewModel. Simplyfing, я хочу сказать, что в представлении «не должно быть позволено» напрямую обращаться к модели (или ViewModel), потому что вы не можете «априорно» знать, что делает функция ComputeXXX! – spiderman77

+1

Извините, я упустил это. У меня НЕ было бы Cart.ComputeXXX на моей модели Cart, я бы переместил его в CartService.GetCartXXXValue (Корзина); В качестве примера. Затем вы можете использовать этот CartService в своем контроллере для создания ViewModels.С помощью этого метода ваш вид никогда не должен вызывать функции, которые меняют модель, поскольку данные на ней будут исключительно для отображения. – JBeagle

ответ

1

Мне вообще не нравятся методы на моделях. В этом случае я бы написал свойство readonly TotalValue, которое делает тот же расчет. Свойства не должны иметь побочных эффектов, поэтому они должны быть безопасными для использования в представлении.

Смежные вопросы