2009-09-07 22 views
7

¿cuál es la mejor práctica para la presentación de formularios en asp.net mvc. He estado haciendo un código como el de abajo, pero tengo la sensación de que hay una manera mejor. sugerencias?asp.net mvc Formas Colección al presentar

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

Respuesta

10

Puede usar los parámetros directamente; los parámetros serán automáticamente analizados y convertidos a su tipo correcto. Los nombres de los parámetros en el método deben coincidir con los nombres de los parámetros que se publican de su formulario.

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

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

funciona esto generalmente en los objetos más complejos, así, siempre que sus propiedades se pueden establecer, y siempre y cuando sus claves del formulario están en el formato objectName.PropertyName. Si necesitas algo más avanzado, usted debe buscar en 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

En mi opinión, el Model Binder es más limpio. Puede obtener más información al OdeToCode.com

Básicamente, usted envuelve su entrada desde un FormCollection al modelo deseado así como a la validación.

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

En el controlador

public ActionResult AddNewLink(Link link) 
Cuestiones relacionadas