2009-09-07 15 views
7

quelle est la meilleure pratique pour soumettre des formulaires dans asp.net mvc. J'ai fait du code comme ci-dessous mais j'ai le sentiment qu'il y a un meilleur moyen. suggestions?asp.net mvc Forms Collection lors de la soumission

[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); 

Répondre

10

Vous pouvez utiliser directement les paramètres; les paramètres seront automatiquement analysés et castés à leur type correct. Les noms de paramètres de la méthode doivent correspondre aux noms de paramètres publiés dans votre formulaire.

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

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

Cela fonctionne généralement sur des objets plus complexes et, aussi longtemps que ses propriétés peuvent être définies, et aussi longtemps que vos clés de formulaire sont au format objectName.PropertyName. Si vous avez besoin de quelque chose de plus avancé, vous devriez regarder dans 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

À mon avis, le modèle de classeur est plus propre. Vous pouvez en apprendre plus à OdeToCode.com

Fondamentalement, Vous enveloppez votre entrée d'un FormCollection à un modèle souhaitable ainsi que la validation.

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)); 
    } 
} 

Dans le contrôleur

public ActionResult AddNewLink(Link link) 
Questions connexes