[ASP.NET MVC] Преборени проблеми


10

Всеки от нас пише проекта си индивидуално и вероятно се сблъсква с някакви проблеми, над които си блъска главата дълго време, търси информация по форуми и т.н. Затова си помислих, че ще е доста полезно, ако си споделяме кой какво е открил като особеност при писане на MVC приложение. 

Ще започна аз с нещо, което помъчих днес: 

Ако се опиташ да регистрираш bundle със същото име като някоя папка в солушъна, получаваш грешка 403 forbidden error. Решението е да преименуваш bundle-а. 




Отговори



7

Ето и един досаден проблем, свързан с KendoUI и unobtrusive-jquery.js -> НЕ ги import-вайте като Bundle по този начин:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
    "~/Scripts/Kendo/jquery.min.js",
    "~/Scripts/jquery.unobtrusive-ajax.min.js"));

Защото се зареждат в обратен ред и се чупи.

Направете си два Bundle-a:

bundles.Add(new ScriptBundle("~/bundles/unobtrusive-jquery").Include(
    "~/Scripts/jquery.unobtrusive-ajax.min.js"));
            
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
    "~/Scripts/Kendo/jquery.min.js"));
След това в _Layout си ги import-вате по нормалния начин в <head>
 
     @Scripts.Render("~/bundles/jquery")
     @Scripts.Render("~/bundles/unobtrusive-jquery")
     @Styles.Render("~/Content/kendo")
     @Scripts.Render("~/bundles/kendo")

от martin.nikolov (4535 точки)


0
Спести ми няколко часа псуване. Аз се чудя защо AJAX настроен за POST заявки подава GET заявка, а то било заради незаредена "jquery.unobtrusive-ajax.min.js". Тотално съм изключил в последно време :)

от Hades12 (284 точки)

0
Смисълът на bundle-a е да компресира няколко файла в един, така че да се намалят заявките към сървъра за ресурси



3

Аз ще споделя една добавка, която си написах за Automapper конфигурацията в случай, че на някой му трябва нещо такова:

Ако имате много модели от базата (мисля, че веки от нас ще има на този проект) и в същото време искате да имате по 2 ViewModel-а за всяко - едно детаилно и едно просто, с текущата конфигурация на AutoMapper ще трябва да си пишете 2 класа.

Това, което аз написах ви позволява да направите нещо от сорта:

UniversityViewModel : IMapFrom<University> , ISimpleView<SimpleViewModel>

Това създава мап University -> SimpleViewModel и по този начин може да си имате отделни имплементации за сложните ViewModel-и и един прост ViewModel, който да съдържа да кажем Id и Name и да е общ за всички модели от базата. 
Можете също да наследите ISimpleView няколко пъти като му подавате различна имплементация

Това е особено полезно ако имате дълбока йерархия, като например University->Faculty->Course->CourseModule и ползвате kendo grid за администрацията и във формата за създаване на CourseModule трябва да изберете Universit, Facultiy и Course


ЛИНК


от G.Genov (110 точки)


0
Някой да е имал проблем с AJAX-а?
Демата ми работят, но когата се опитам да го направя в нов проект CORS ми блокира заявката. Възможно ли е да е от версията на jquery защото май само това не съм пробвал?

от bstaykov (528 точки)


0
Добави ли Unobtrusive библиотеката?

от dimo.petrof (2887 точки)

0
Ти към какъв сървър се връзваш. CORS не може да ти блокира заявката, ако си към същия сървър.

от ivaylo.kenov (30760 точки)



0
Здравейте! Искам да ви попитам : някой да се е сблъсквал с проблем с client side валидацията при partiaл view-ta? При мен нещо не я отчита изобщо, имам заредено jquery.validate, в web.config стойностите за client side валидация и unobtrusive са ми сетнати на true, имам ValidationMessageFor в partial view-то, обаче нещо не се получава, праща се заявка към сървъра всеки път. Четох доста неща из Интернета, ама не помогнаха.

от Izabel_G (311 точки)


0

Има ли по-лесен начин за заобикаляне на грешката "A circular reference was detected while serializing an object of type ", когато работим с Кендо елементи от описания във FAQ секцията на Телерик тук?


от Drago (711 точки)


0
Правиш си ViewModel на обекта и като дръпнеш данните от базата ги map-ваш към ViewModel-а. Кажи речи същото, което са описали и във FAQ секцията. По-лесен начин не се сещам.

от triplexsa (60 точки)


4
Аз се преборих с проблем с културите и използването на Телерик Kendo UI Grid.

Има проблем, когато на машината има примерно сетнат български език. Парсва наобратно месеца и деня. Сложих в овъррайднат бегинрекуест на контролера:
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

от samardzhiev (167 точки)


0
Аз също се сблъсках с този проблем, реших го като в метода за Create на GridController-а просто променям model.CreatedOn = model.CreatedOn.ToLocalTime();

от triplexsa (60 точки)


3

Ако някой има M : M връзка между 2 entities и иска да използва чекбоксове в темплейта, като например избор на много категории за блог пост, ето някои полезни ресурси:

  - как да си направим чекбоксовете на ръка:
    http://stackoverflow.com/questions/12808936/how-do-i-render-a-group-of-checkboxes-using-mvc-4-and-view-models-strongly-type
  - Два Nuget пакета, които намерих по-късно и вече нямам време да тествам, но мисля, че ще вършат работа:
    https://www.nuget.org/packages/MvcCheckBoxList/
    https://www.nuget.org/packages/Hex/


от pavlinadrosos (950 точки)


2

Аз също имах проблем с датите на Kendo UI Griд. Ето така реших проблема: В грида за колоната за датата написах: cols.Bound(news => news.CreatedOn).ClientTemplate("#=kendo.toString(CreatedOn, 'dd/MM/yyyy HH:mm:ss')#"); След това в EditorTemplates->DateTime сложих следното: @model DateTime?


@(Html.Kendo().DateTimePickerFor(m => m).ToClientTemplate()). По този начин датите ми станаха в еднакъв формат.

Другият проблем, който имах е, с Automapper-a, понякога не искаше да ми прави обратния mapping, от ViewModel към модел в базата и го оправих така:   Mapper.CreateMap<NewsViewModel, News>();

                var dbModel = Mapper.Map<News>(model); Трябваше първо да извикам функцията : CreateMap

от Izabel_G (311 точки)


0
CreateMap е бавна функция и не върви да я извикваш всеки път при всяка заявка към този екшън.

от ivaylo.kenov (30760 точки)

0
Ако я махна и ми гърми, че нямам създаден мапинг, има ли друг начин да го оправя този проблем, без да викам фунцкията? В ViewModela си имам IMapFrom

от Izabel_G (311 точки)


3

Аз пък се сблъсках с 1 бъг, който идва от _LoginPartial-a на проекта.

Тъй като не е зададена Area на Register/Login/Logoff, сървъра търси action-ите в конкретната area, в която се намирате и тъй като не открива Account контролер дава грешка.

Бъгчето се фиксва много лесно, в _LoginPartial-a, routeValues: null трябва да се замени с routeValues: new { Area = string.Empty } за всеки един от ActionLink-овете.


от IvaylaH (150 точки)


1

ASP.NET MVC - Грешка при запис в базата при ползване на връзка много към много и Ninject (DI Container)  

Здравейте, бих искал да споделя решението на един проблем с ASP.NET MVC 5, с който се сблъсках днес. Ползвам Entity Framework 6 с Repositories и Ninject (за Dependency Inversion).

Предварителни настройки: EF6, Ninject (DI)

Проблем: Имплементиране на връзка между 2 ентитита много към много, като всяко от тях си има repository. При редакция на 2-те ентитита от потребителя и пробване за записване в базата се получава грешка:

"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."

ApplicationDbContext-a се подаваше в конструкторите на класовете, чрез своя интерфейс: IApplicationDbContext.

Binding настройките на ApplicationDbContext в NinjectWebCommon бяха:

kernel.Bind<DbContext>().To<ApplicationDbContext>();
kernel.Bind<IApplicationDbContext>().To<ApplicationDbContext>();

Замених всички срещания на IApplicationDbContext с ApplicationDbContext в целия solution като направих настройките на ApplicationDbContext в NinjectWebCommon на:

kernel.Bind<DbContext>().To<ApplicationDbContext>();

но проблемът не се оправи. След това отново промених Binding настройките на ApplicationDbContext в NinjectWebCommon.cs (не ви го препоръчвам) на:   

kernel.Bind<DbContext>().To<ApplicationDbContext>().InSingletonScope();

когато пробвах да показвам данни на едното entity (с връзка много към много) започнах да получавам грешка:  

"Object reference not set to an instance of an object"

Решението:

- Замяна на IApplicationDbContext с ApplicationDbContext в целия Visual Studio Solution (ако въобще ползвате този интерфейс).

- Изтриване на всички предишни Binding настройки на ApplicationDbContext в NinjectWebCommon.cs и заменянето им с:  
kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();

 

Решението (EDIT):

Следвайки съвета на Ивайло Кенов по-долу запазваме IApplicationDbContext, който се подава като параметър в repositories. Eдинствената промяна, която правим е:

- Изтриване на всички предишни Binding настройки на ApplicationDbContext в NinjectWebCommon.cs и добавянето на:
kernel.Bind<IApplicationDbContext>().To<ApplicationDbContext>().InRequestScope();

* Ако вече имате: kernel.Bind<DbContext>().To<ApplicationDbContext>() - него може да не го махате (би трябвало да работи и с него), но е задължително да се добави: kernel.Bind<IApplicationDbContext>().To<ApplicationDbContext>().InRequestScope() за да се избегне работата с повече от един DbContext и съответните грешки, до които води.

Надявам се, че тези стъпки ще помогнат на някой, който има същият или подобен на моя проблем и ще му спести малко време и главоболия :)


от encounter (1041 точки)


0
Това е изключително грешно, което правиш, защото с течение на времето ще пренапълниш контекста с обекти, които той следи и ще стане бавен, муден и накрая OutOfMemoryException. Казвали сме решението на твоя проблем с достъпването на данните на лекции, ако слушате, ще го чуете. :)

от ivaylo.kenov (30760 точки)

0
Всъщност извинявай, моя грешка, прочетох InSingletonScope, а не InRequestScope. Но все пак сме казвали умното решение. Също не трий интерфейса. Ти ако го триеш, за какво то е Ninject,ползвай си го направо. Дай му Bind

от ivaylo.kenov (30760 точки)