2009-09-07 42 views
7

Was ist die beste Praxis für das Absenden von Formularen in asp.net mvc. Ich habe Code wie diesen unten gemacht, aber ich habe das Gefühl, dass es einen besseren Weg gibt. Vorschläge?asp.net mvc Formulare Sammlung beim Einreichen

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

Antwort

10

Sie können die Parameter direkt verwenden; Die Parameter werden automatisch analysiert und in den richtigen Typ umgewandelt. Die Parameternamen in der Methode müssen mit den Parameternamen übereinstimmen, die von Ihrem Formular bereitgestellt werden.

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

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

Dies funktioniert im Allgemeinen auf komplexere Objekte als auch, solange seine Eigenschaften eingestellt werden können, und so lange, wie Sie Ihre Form Schlüssel im Format objectName.PropertyName sind. Wenn Sie etwas fortgeschritteneres brauchen, sollten Sie in model binders schauen.

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

Meiner Meinung nach ist das Modell Binder sauberer. Weitere Informationen erhalten Sie unter OdeToCode.com

Grundsätzlich umschließen Sie Ihre Eingaben von einer FormCollection in ein wünschenswertes Modell sowie eine Validierung.

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

In der Steuerung

public ActionResult AddNewLink(Link link) 
Verwandte Themen