Tag Cloud: MVC

Web@Work

Scritto da Massimo Bonanni il 19 novembre 2012

Definire metodi per GET e POST di una Action con gli stessi parametri

Scritto da Luca Cestola il 20 aprile 2012 • Linguaggio: C#  • Livello: 100 

Anche se non di frequente, può capitare di dover definire due metodi differenti, uno per il metodo HTTP GET ed uno per il metodo POST, che rispondano ad una stessa Action.

Seguendo le convenzioni i metodi risulterebbero identici, pertanto il codice non può essere compilato. in questo caso è possibile Utilizzare un nome differente per uno dei due metodi e decorarlo con l'attributo ActionName per specificare l'action alla quale fa riferimento.

public ActionResult Create()
{
    return View();
}
 
[ActionName("Create")]
[HttpPost]
public ActionResult Create_Post()
{
    ...
    return View();
}

 

 

Utilizzare le risorse nell'attributo display in MVC

Scritto da Alessandro Mostarda il 23 marzo 2012 • Linguaggio: C#  • Livello: 100 

Di default, ad oggi, dobbiamo settare 2 parametri: il tipo di risorsa ed una stringa che contiene il nome della proprietà della risorsa stessa.

Ma, utilizzando il seguente apprrocio è possibile utilizzare la risorsa specificando un solo parametro e soprattutto senza l'uso di alcuna stringa.
In tal modo avremo anche il vantaggio che il compilatore ci avvertirà di eventuali voci di risorsa rinominate e/o eliminate.

L'approccio si compone 1 file T4 ed un attributo custom che eredita da DisplayAttribute.

Il file T4 è il seguente:

<#@ template debug="true" hostspecific="true" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #>
<#@ assembly name="EnvDTE" #>
<#@ assembly name="EnvDTE80" #>
<#@ assembly name="VSLangProj" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#
   DTE dte = null;
    var serviceProvider = Host as IServiceProvider;
    if (serviceProvider != null) {
        dte = serviceProvider.GetService(typeof(SDTE)) as DTE;
    }
 
   var project = dte.Solution.FindProjectItem(Host.TemplateFile).ContainingProject;
 
   try
   {
      string rootNamespace =  project.Properties.Item("RootNamespace").Value.ToString();
      var resources = GetResources(project.ProjectItems, "");
  
      foreach(var currentNamespace in resources.Select(s=> s.Namespace).Distinct())
      {
         var namespaceToPrint = rootNamespace + ((string.IsNullOrWhiteSpace(currentNamespace) ? "" : "." + currentNamespace));
         WriteLine(string.Format("namespace {0}", namespaceToPrint));
         WriteLine("{");
         foreach(var currentClass in resources.Where(w => w.Namespace == currentNamespace).Select(s => s.ClassName).Distinct())
         {
            WriteLine(string.Format("\tpublic static class {0}Const", currentClass));
            WriteLine("\t{");
 
            foreach(var currentElement in resources.Where(w => w.Namespace == currentNamespace && w.ClassName == currentClass))
            {
               WriteLine(string.Format("\t\tpublic const string {0} = \"{1}\";", currentElement.Key, namespaceToPrint + "." +currentClass + "|" + currentElement.Key));
            }
            WriteLine("\t}");
         }
         WriteLine("}");
      }
 
   }
   catch(Exception ex)
   {
      Error(ex.ToString());
   }
#>
 
<#+
 
List<ResourceEntry> GetResources(ProjectItems items, string path)
{
   var ret = new List<ResourceEntry>();
   foreach(ProjectItem item in items)
   {
      if(Path.GetExtension(item.Name) == ".resx" && !Regex.IsMatch(item.Name, @".*\.[a-zA-z]{2}(-[a-zA-z]{2})?\.resx"))
      {
         var filePath = (string)item.Properties.Item("FullPath").Value;
         var xml = new XmlDocument();
         xml.Load(filePath);
         var entries = xml.DocumentElement.SelectNodes("//data");
 
         foreach (XmlElement entryElement in entries)
         {
           
            var entry = new ResourceEntry();
            if (path.Length > 0)
            {
               entry.Namespace = path.Substring(1);
            }
            entry.ClassName = item.Name.Replace(".resx", "");
            entry.Key = entryElement.Attributes["name"].Value;
            ret.Add(entry);
         }
      }
 
      if(item.Kind == "{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}")
      {
         ret.AddRange(GetResources(item.ProjectItems, path + "." + item.Name));
      }
   }
   return ret;
}
 
public class ResourceEntry
{
   public string Namespace { get; set; }
   public string ClassName { get; set; }
   public string Key { get; set; }
}
 
#>

 

 Mentre l'attributo display è il seguente:

public class InheritedDisplayAttribute :
        DisplayNameAttribute
{
    private string _localizedName;
    private Dictionary<string, string> _cachedValues;
    public InheritedDisplayAttribute(string localizedName)
    {
        _localizedName = localizedName;
        _cachedValues = new Dictionary<string, string>();
    }
 
    public override string DisplayName
    {
        get
        {
            var cultureCode = Thread.CurrentThread.CurrentUICulture.ToString();
            if (!_cachedValues.ContainsKey(cultureCode))
            {
                _cachedValues.Add(cultureCode, this.ExtractValue());
            }
            return _cachedValues[cultureCode];
        }
    }
    private string ExtractValue()
    {
        var resourceType = Type.GetType(_localizedName.Split('|').First());
        var propertyName = _localizedName.Split('|').Last();
        return resourceType.GetProperty(propertyName).GetValue(null, null).ToString();
    }
}

 

Il tutto ci consente di utilizzare l'attributo in tale modo:

 
[InheritedDisplay(NomeRisorsaConst.VoceRisorsa)]
 

 

 P.S. Il suffisso Const l'ho fissato io nel File T4, ma possiamo cambiarlo a nostro piacimento.

WWW - We Want Web

Scritto da Massimo Bonanni il 02 febbraio 2012

Abilitare il data annotation attribute "Required" sui checkbox con la validazione unobtrusive in MVC3

Scritto da Alessandro Mostarda il 23 gennaio 2012 • Linguaggio: C#,VB  • Livello: 200 

Di default, se nel nostro model abbiamo una proprietà con l'attributo required, l'unobtrusive validation di MVC3 non utilizza l'attributo stesso nel caso in cui utilizziamo la checkbox come tag html di rendering. Utilizzando questo script è possibile abilitare l'attributo required sul tag CheckBox.

$(function   () {
    $.extend($.validator.unobtrusive, {
        overrideAdapter: function (name, func) {
            for (var i = 0; i < this.adapters.length; i++) {
                if (this.adapters[i].name == name) {
                    this.adapters[i].adapt = func;
                    break;
                }
            }
        }
    });
});
   
$(function   () {
    $.validator.unobtrusive.overrideAdapter("required", function (options) {
        options.rules["required"] = true;
        if (options.message) {
            options.messages["required"] = options.message;
        }
    });
});

WebCamp - Roma 24 Gennaio 2012

Pubblicata il 12 dicembre 2011

Il prossimo 24 Gennaio, nella sede romana di Microsoft (Via Avignone 10) si terrà un evento gratuito sulle ultime tecnologie Microsoft per il web.

Per maggiori informazioni fate riferimento al post apparso su MSDN Blog: http://blogs.msdn.com/b/italy/archive/2011/12/12/webcamp-roma-24-gennaio-2012.aspx?utm_source=twitterfeed&utm_medium=twitter

Nello stesso post trovate i link per iscrivervi.

Rilascia la Developer Preview di ASP.NET MVC 4

Pubblicata il 15 settembre 2011

Nel corso della Keynote introduttiva del secondo giorno di //BUILD Scott Guthrie ha annunciato la disponibilità della Developer Preview di ASP.NET MVC 4.

La Preview è disponibile sul Web Platform Installer sia per Visual Studio 2010 che per Visual Studio 11 Developer Preview. In alternativa è possibile scaricare l'Installer.

Introduzione ad ASP.NET MVC

Scritto da Giorgio Di Nardo il 04 maggio 2011 • Livello: 100 

ASP.NET MVC è un nuovo approccio alla programmazione web che si aggiunge a Web Forms come alternativa e non come sostituto. In questo articolo cercheremo di evidenziarne i pregi e di confrontarne le caratteristiche con il fratello maggiore.

Rilasciato un aggiornamento dei tool per ASP.NET MVC 3

Pubblicata il 13 aprile 2011

E' stato annunciato ieri, durante il Mix 2011, il rilascio in un aggiornamento ai tool di ASP.NET MVC 3. L'aggiornamento non riguarda il runtime del framework (che resta invariato) ma solo i tool utilizzabili in Visual Studio 2010.

Maggiori informazioni sul blog di Pietro Brambati o su quello di Phil Haack.

Corso ASP.NET MVC 3 gratis per 48 ore

Pubblicata il 09 febbraio 2011

In occasione della ASP.NET MVC Conference tenuta ieri, Pluralsight mette a disposizione gratuitamente per le prossime 48 ore oltre 3 ore di corso su ASP.NET MVC 3.

E' possibile fruire del corso direttamente sul sito di Pluralsight.

Rilasciata la Release Candidate 2 di ASP.NET MVC 3

Pubblicata il 13 dicembre 2010

Come annunciato sul blog di Scott Guthrie e su quello di Phil Haack è stata rilasciata la Release Candidate 2 di ASP.NET MVC 3, il  framework Microsoft per scrivere applicazioni web su piattaforma ASP.NET secondo i dettami del design pattern MVC.

La nuova versione, disponibile sul sito Microsoft, tra le altre cose risolve il problema di incompatibilità della RC precedente con la SP1 Beta di Visual Studio 2010.

Pattern architetturali – prima parte

Scritto da Marco Amendola il 17 novembre 2010 • Livello: 200 

Un’applicazione è una struttura complessa, la cui costruzione non può essere affidata al caso: le varie parti devono interagire correttamente e in modo controllabile. Vengono esaminati i vari pattern architetturali affermatisi, nel corso del tempo, su questa tematica.

Rilasciata la RC di ASP.NET MVC3

Pubblicata il 09 novembre 2010

Questa mattina è stata rilasciata la Release Candidate di MVC3.

L'annuncio nel post di Scott Guthrie.

E' possibile scaricare la Release Candidate da seguente link.

Recuperare i parametri della richiesta HTTP <GET> in MVC2

Scritto da Nicolò Carandini il 03 settembre 2010 • Linguaggio: C#  • Livello: 100 

In un sito sviluppato con MVC 2 l'URL non corrisponde direttamente ad un file presente nel sito, ma viene interpretato mediante una routing table.
Ad esempio, l'URL http://miosito/torneo/risultati determina l'istanziazione del controller TorneoController e la chiamata al metodo Risultati (nel quale potremo elaborare i risulati del torneo e ritornare la pagina web che li visualizza).
Mentre l'URL http://miosito/torneo/risultatipartita/3 determina l'istanziazione del controller TorneoController e la chiamata al metodo RisultatiPartita con il parametro id pari a 3 (nel quale elaborare i dati relativi alla partita il cui id è pari a 3 e ...).
Questo grazie all'impostazione di default contenuta nella routing table, contenuta nel file Global.Asax, che può esssere ampliata e modificata a piacere.
Se abbiamo necessità di passare più parametri al metodo del controller, è possibile utilizzare la codifica HTTP <GET>, come ad esempio:
http://miosito/torneo/risultatipartita?GiornataID=8&SquadraID=12&Anno=2007
In questo caso, per recuperare le informazioni contenute nei parametri della richiesta HTTP <GET> possiamo usare l'oggetto Request.QueryString:

namespace MioProgetto.Controllers
{
public class TorneoController : Controller
{
//
// GET: /torneo/risultatipartita?GiornataID=[giornataID]&SquadraID=[squadraID]&Anno=[anno]

public void RisultatiPartita()
{
// Attenzione: in questo esempio non ci sono controlli...
string giornataID = Request.QueryString[0];
string squadraID = Request.QueryString[1];
string anno= Request.QueryString[2];
}
// attenzione: normalmente un controller ritorna una view, qui scriviamo direttamente l'html...
Response.Write("<h1>Sono stati richiesti i risultati della partita:</h1>" +
"<p>GiornataID: " + giornataID + "</p>" +
"<p>SquadraID: " + squadraID + "</p>" +
"<p>Anno: " + anno + "</p>"
);
}
}
}

 

Asp.Net Mvc- Html5 Helpers Toolkit

Pubblicata il 18 agosto 2010

ASP.net MVC HTML5 Helpers Toolkit contiene una serie di controlli che si possono utilizzare per costruire applicazioni Asp.Net  sfruttando HTML5.

Download | Fonte

ASP.NET MVC 3 Preview 1 disponibile per il download

Pubblicata il 27 luglio 2010

Non è stato ancora ufficalizzato da Microsoft  ma è disponibile per il download la preview 1 di ASP.NET MVC 3.

Tra le novità più interessanti di questa preview:

  • il nuovo View Engine Razor;
  • proprietà View e ViewModel dinamiche;
  • supporto per View Engine multipli durante l'"Add View" in Visual Studio;
  • i Global Filters;
  • supporto ai validation attributes di .NET Framework 4.0;
  • nuovi tipi per le Action Result;
  • supporto alla Dependency Injection.

Per scaricare la preview utilizzate il link.

 

Fonte : Blog Simone Chiaretta

 
x