ASP.NET MVC
  • Validare conditionala pe client - in cazul in care ascund/afisez dinamic unele campuri pe client, campuri care vreau sa fie validate atunci cand sunt afisate
    • le pot scoate atributul name cand sunt ascunse, urmand sa il adaug doar cand le afisez.
  • Performanta
    • Controllerele care suporta sesiunea sunt tratate ca fiind sincrone in contextul unui user => daca avem o pagina cu mai multe apeluri AJAX catre acelasi controller, apelurile se vor executa unul dupa altul in loc sa fie rulate asincron. Daca decorez controller-ul cu atributul [SessionState(SessionStateBehavior.Disabled)] => nu mai suporta sesiunea => e asincron.
  • Folosirea numelor proprietatilor in template-uri
    • ViewData.TemplateInfo.GetFullHtmlFieldId("") - spre deosebire de ViewData.ModelMetadata.PropertyName , functioneaza si in cazul id-urilor ca Items[4].Name
  • Ascunderea anumitor proprietati din model la randare (nu ma refer la HiddenInput)
    • Aplic atributul ScaffoldColumn(false)
  • Initializarea sesiunii NHibernate in Application_BeginRequest
    • Din cate vad, e de preferat sa fac asta in Application_PostMapRequestHandler, ca sa am acces la HttpContext.Current.CurrentHandler
protected void Application_PostMapRequestHandler(object sender, EventArgs e)
{
    if (Context.CurrentHandler is MvcHandler)
        SessionManager.BeginTransaction();
}
  • Validare custom pe server
// inregistrarea mesajului de eroare pe server
ViewData.ModelState.AddModelError("ABC", "Mesajul meu de eroare");
return View(myPrettyModel);
 
//afisarea mesajului de eroare in view
@Html.ValidationMessage("ABC")
  • Global Filters + Dependency Injection
    • Clasa de mai jos e invocata automat daca e configurat DI-ul in aplicatie (si daca e inregistrata in container :) ).
    public class FilterProvider : IFilterProvider
    {      
 
        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
        {
            return new[] { ActionFilter<MyCustomFilter>() };
        }
 
        private static Filter ActionFilter<T>(int? order = null)
        {
            return new Filter(DependencyResolver.Current.GetService<T>(), FilterScope.Action, order);
        }
 
    }
  • Accesarea unui UrlHelper dintr-o metoda de extensie a HtmlHelper
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action("Home", "Index")
  • Localizare folosind resurse
    • Nu ar trebui folosit directorul App_GlobalResources pentru a pastra resursele, pentru ca are niste probleme in MVC
    • Fisierul .resx ar trebui setat ca EmbeddedResource, iar custom tool-ul selectat ar trebui sa fie PublicResXFileCodeGenerator (pentru ca membrii generati sa poata fi accesati din view-uri).
    • Pentru a accesa resursele din alte proiecte decat cel web: ResourceManager = new ResourceManager("Website.GlobalRes", Assembly.Load(new AssemblyName("Website")));
    • Mai multe detalii: http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-net-mvc-projects.aspx
  • Prevent automatic encoding
    • @Html.Raw(<text>)
  • "The name 'model' does not exist in the current context" - cand incerc sa randez un view
    • Probabil a fost sters web.config-ul din directorul Views
  • Modificarea valorilor dintr-o forma serializata, care urmeaza sa fie postata pe server prin jQuery.post
var form = $('#myForm').serializeArray();
form.push({ name:'val1', value: 6 });
form.push({ name:'val2', value: 29 });
 
$.post('@Url.Action("MyAction")', form);
  • Creez o area noua, dar nu e recunoscuta in aplicatie

AreaRegistration.RegisterAllAreas(); <- in Application_Start

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License