[ASP.NET MVC] Грешно ли bind-вам ?


0

До скоро bind-вах като в модела слагах пропъртитата, които ще ми трябват за модела от базата, но ми хрумна, че в модела мога просто да имам:

public InventoryItem CreationShell { get; set; }

И да ги bindvam за Model.CreationShell.Name (e.g.), подавайки вече готовия обект на service-а, а да не се занимавам да преписвам всичките пропъртита на ръка.
Is it wrong, anti-KPK, stupid ? 




Отговори



0

Може ли да изясниш повече въпроса си?

Очевидно има значение дали използваш EF и code first. Тогава базата ти се построява на база на моделите и така или иначе в модела ще имаш всички пропъртита от базата. Не съм сигурен и тук какво разбираш под ''байндвам". За да ти е напълно КПК- моделите трябва да ги мапнеш с view model-и, с които да работят view-тата.


от ivan.mihov1 (4988 точки)


0

Колега, не ти е мн ясно написан въпроса, но ще се опитам да ти изложа няколко гледни точки :) На ниво база, ако използваш Entity Framework и code first подход, не е никак грешно даже си е редно да бъде така. За да работи трябва обаче да е виртуално пропъртито, поради lazy-loading-a и Proxy-то, което прави Entity Framework зад кулисите. Също така тр да имаш и връзка към ID-то, за да знае кое да попълни. Това с т.нар. навигационни пропъртита

public int CreationShellId { get; set; } public virtual InventoryItem CreationShell { get; set; }

Ако става дума за т.нар DTOs (data-transfer objects) или View Model-и по-скоро виж как се използва AutoMapper, Ники и Иво са го обяснявали в лекциите за MVC. 

Поздрави,

Митака


от mita4itu (1969 точки)


0
My bad, говоря за bind-а от view-to към контролера. с други думи 
@model MvcTemplate.Web.ViewModels.Inventory.InventoryCreationModel
Това което помня е, че ако InventoryModel има име и описание в InveotryCreationModel за по-лесно bind-ване без JS трябва да има същите пропъртита и то само се оправя, но после в контролера когато пращаш обекта за записване към service-а (Създаването на ItemName)
[HttpPost] [ValidateAntiForgeryToken] public ActionResult AddItemType(NameCreationModel model) { if (!this.ModelState.IsValid) { return this.View(model); } // Ето за това говоря var nameToAdd = new ItemName() { Value = model.Name, InventoryType = model.TypeToSubmit }; this.names.Add(nameToAdd); return this.View(); }
Мисълта ми е, грешно ли е във viewmodel-а да имам въпросния shell, който после направо да изпратя към service-а
[HttpPost] [ValidateAntiForgeryToken] public ActionResult AddItemType(NameCreationModel model) { if (!this.ModelState.IsValid) { return this.View(model); } this.names.Add(model.CreationShell); return this.View(); }


от DanteSparda (645 точки)


0
Възможно най-малко логика в модела, все пак ползваш ASP.NET MVC.Не му е това целта на модела....ако не искаш да се повтаряш, ползвай AutoMapper или подобна библиотека.



1
В идеалния вариант view-то и контролера ти трябва да работи с view models, не модели. Те не трябва да знаят за никакви модели.

от ivan.mihov1 (4988 точки)