2009-09-07 13 views
7

jaka jest najlepsza praktyka przesyłania formularzy w asp.net mvc. Robiłem kod jak poniżej, ale mam wrażenie, że jest lepszy sposób. propozycje?asp.net mvc zbiera formularze podczas przesyłania

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

Odpowiedz

10

Możesz użyć parametrów bezpośrednio; parametry zostaną automatycznie przeanalizowane i rzucone do właściwego typu. Nazwy parametrów w metodzie muszą być zgodne z nazwami parametrów umieszczonymi w formularzu.

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

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

to zazwyczaj działa na bardziej złożonych obiektów, jak również, o ile jego właściwości można ustawić, i tak długo, jak klucze formularza są w objectName.PropertyName formatu. Jeśli potrzebujesz czegoś bardziej zaawansowanego, powinieneś zajrzeć do 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

Moim zdaniem, Model Binder jest czystszy. Możesz dowiedzieć się więcej pod OdeToCode.com

Zasadniczo zawijasz dane wejściowe z FormCollection do pożądanego modelu, a także sprawdzania poprawności.

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

W regulatorze

public ActionResult AddNewLink(Link link)