2009-09-07 27 views
7

qual è la procedura migliore per inviare moduli in asp.net mvc. Ho fatto codice come questo di seguito, ma ho la sensazione che ci sia un modo migliore. suggerimenti?asp.net mvc Forms Collection quando si invia

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult AddNewLink(FormCollection collection_) 
    { 
     string url = collection_["url"].ToString(); 
     string description = collection_["description"].ToString(); 
     string tagsString = collection_["tags"].ToString(); 
     string[] tags = tagsString.Replace(" ","").Split(','); 

     linkRepository.AddLink(url, description, tags); 

risposta

10

È possibile utilizzare direttamente i parametri; i parametri verranno automaticamente analizzati e convertiti nel tipo corretto. I nomi dei parametri nel metodo devono corrispondere ai nomi dei parametri pubblicati dal modulo.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddNewLink(string url, string description, string tagsString) 
{ 
    string[] tags = tagsString.Replace(" ","").Split(','); 

    linkRepository.AddLink(url, description, tags); 
} 

funziona questo genere su oggetti più complessi, così, a patto che le sue proprietà possono essere impostate, e fintanto che le chiavi di forma sono in formato objectName.PropertyName. Se hai bisogno di qualcosa di più avanzato, dovresti esaminare model binders.

public class MyObject 
{ 
    public int Id {get; set;} 
    public string Text {get; set;} 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddNewLink(MyObject obj) 
{ 
    string[] tags = obj.Text.Replace(" ","").Split(','); 

    linkRepository.AddLink(url, description, tags); 
} 
3

A mio parere, Model Binder è più pulito. Ulteriori informazioni su OdeToCode.com

Fondamentalmente, i dati inseriti in FormCollection vengono trasformati in un modello desiderabile e in una convalida.

public class LinkModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var link = new Link(); 
     link.Url = GetValue<string>(bindingContext, "url"); 
     // ... and so on for all properties 

     if (String.IsNullOrEmpty(url.Name)) 
     { 
      bindingContext.ModelState.AddModelError("Url", "..."); 
     } 

     return link; 
    } 

    private T GetValue<T>(ModelBindingContext bindingContext, string key) 
    { 
     ValueProviderResult valueResult; 
     bindingContext.ValueProvider.TryGetValue(key, out valueResult);    
     return (T)valueResult.ConvertTo(typeof(T)); 
    } 
} 

Nel regolatore

public ActionResult AddNewLink(Link link) 
Problemi correlati