Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ООП в ASP.NET MVC

41K
30 января 2012 года
rikki
46 / / 27.05.2010
С ASP.NET MVC знаком не так уж давно, и при создании представлений усиленно использую строго типизированные представления. Очень часто приходиться создавать классы вида:
 
Код:
public class ViewModelStatistic
    {
        public string CountOfOrders { get; set; }
        public string CountOfUsers { get; set; }
        public string CountOfMenuItems { get; set; }
        public string CountOfNewMesages { get; set; }
        public string CountOfAllMessages { get; set; }
    }

Стало интересно узнать такую вещь: такие "классы данных" вроде противоречат концепции ООП, но является ли подобная практика нормальной в ASP.NET MVC, или будущий руководитель будет тыкать меня носом в это ?
Я понимаю, что вопрос может не иметь однозначного ответа, но интересно выслушать мнения более компетентных людей, взвесить за и против.
277
30 января 2012 года
arrjj
1.7K / / 26.01.2011
Смотря какую смысловую нагрузку несут get/set. Если это обёртка для методов Orders.Count() Users.Count()... , то сет тут зачем? Если это какая то пассивная структура то property тут ни к чему, используй просто паблик-поля.

Такчто тыкать будут или нет зависит от того зачем и как ты используешь такие структуры. - приведи реальный пример.
41K
30 января 2012 года
rikki
46 / / 27.05.2010
1). Это не обертка, и ,в принципе, смысловой нагрузки get set не несут.(Потому и создал тему, так как получаются классы без логики)
2). Например, для post запросов, используя Json. Обьект с такими же полями сериализуеться скриптом и отсылается на сервер. Экшн принимает параметр модели ViewModelStatistic
 
Код:
public Json SomeAction (ViewModelStatistic model)
{
// некоторый код
return Json("Ok");
}

3). Реальный пример:
Код:
[Serializable]
    public class UserOrderViewEditModel
    {
        public string StartDate { get; set; }
        public string EndDate { get; set; }
        public string typeOf { get; set; }
        public string[] ListMenu { get; set; }
        public string User { get; set; }
        public string Status { get; set; }
        public string Comment { get; set; }
        public string OrderId { get; set; }

        public UserOrderViewEditModel()
        {

        }

        public UserOrderViewEditModel(UserOrder order)
        {
            this.Comment = order.Comment;
            this.StartDate = order.StartDate.ToString();
            this.typeOf = order.Type_of;
            this.User = order.aspnet_Users.UserName;
            this.EndDate = order.FinishDate.ToString();
            this.Comment = order.Comment;
            this.OrderId = order.Order_id.ToString();
        }
       
    }

Клас UserOrder - это класс созданный LinqToSql по реальной БД.
И метод что с ним работает:
 
Код:
[HttpPost]
        public ActionResult Edit(UserOrderViewEditModel model)
        {
            _dataManager.OrderRepozitory.UpdateOrder(model);
            return Json("Ok");
        }


4). И ещё один реальный пример.
Код:
public class UserOrderViewShowModel:UserOrderViewEditModel
    {
        public int[] SelectedItemId { get; set; }
        public MultiSelectList OrderList { get; set; }
        public MultiSelectList Menu { get; set; }
        public MultiSelectList MenuTypes
        {
            get
            {
                return new MultiSelectList(InitializeMenuTypes(), "Value", "Text");
            }
           
        }

        public MultiSelectList TypeOf
        {
            get
            {
                return new MultiSelectList(InitializeTypeOf(), "Value", "Text");
            }
           
        }



        private List<SelectListItem> InitializeTypeOf()
        {
            List<SelectListItem> TypeOf = new List<SelectListItem>();
            TypeOf.Add(new SelectListItem { Text = "С собой", Value = "0" });
            TypeOf.Add(new SelectListItem { Text = "На месте", Value = "1" });
            return TypeOf;
        }

        private List<SelectListItem> InitializeMenuTypes()
        {
            List<SelectListItem> MenuTypes = new List<SelectListItem>();
            MenuTypes.Add(new SelectListItem { Text = "Первое", Value = "0" });
            MenuTypes.Add(new SelectListItem { Text = "Второе", Value = "1" });
            MenuTypes.Add(new SelectListItem { Text = "Салаты", Value = "2" });
            MenuTypes.Add(new SelectListItem { Text = "Напиток", Value = "3" });
            return MenuTypes;
        }

    }

И один из работающих с ним методом:
Код:
[AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Edit(int Id)
        {
            UserOrderViewShowModel ViewModel = InitializeUserOrderShowModel();
            UserOrder Order = _dataManager.OrderRepozitory.GetUserOrderItem(Id);
            IEnumerable<OrderContent> MenuList = _dataManager.OrderRepozitory.GetOrderContent(Id);
            List<SelectListItem> ListForOrderList = new List<SelectListItem>();
            foreach (var item in MenuList)
            {
                ListForOrderList.Add(new SelectListItem { Text = item.Menu.Name + "=" + item.Count.ToString() + "шт", Value = item.Menu.Price.ToString(), Selected = false });
            }
            ViewModel.OrderId = Order.Order_id.ToString();
            ViewModel.OrderList = new MultiSelectList(ListForOrderList, "Value", "Text");
            ViewData.Model = ViewModel;
            return View();
        }


Критикуйте беспощадно)
З.Ы. Я знаю что наследование тут быть может не совсем корректно да и не дописано оно ещё - только заинтересовался проблемой вот таких вот представлений.
5
30 января 2012 года
hardcase
4.5K / / 09.08.2005
Цитата: rikki
1). Это не обертка, и ,в принципе, смысловой нагрузки get set не несут.(Потому и создал тему, так как получаются классы без логики)

Это совершенно нормально для ASP.NET MVC (общее название таких сущностей - DTO).
Правда, иногда передают просто коллекцию объектов (IList<T>) - она уже содержит свойство Count.

41K
30 января 2012 года
rikki
46 / / 27.05.2010
hardcase, спасибо, буду спать спокойней)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог