asp.net mvc Forms Collection when submitting

后端 未结 2 810
温柔的废话
温柔的废话 2020-12-29 14:27

what is the best practice for submitting forms in asp.net mvc. I have been doing code like this below but i have a feeling there is a better way. suggestions?



        
相关标签:
2条回答
  • 2020-12-29 15:18

    You can use the parameters directly; the parameters will automatically get parsed and casted to its correct type. The parameter names in the method must match the parameter names that are posted from your form.

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

    This generally works on more complex objects as well, as long as its properties can be set, and as long as your form keys are in the format objectName.PropertyName. If you need anything more advanced, you should look into 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);
    }
    
    0 讨论(0)
  • 2020-12-29 15:21

    In my opinion, the Model Binder is cleaner. You can learn more at OdeToCode.com

    Basically, You wrap your input from a FormCollection to a desirable model as well as 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));
        }  
    }
    

    In the controller

    public ActionResult AddNewLink(Link link)
    
    0 讨论(0)
提交回复
热议问题