asp.net mvc Forms Collection when submitting

2020-02-24 01:08发布

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?

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

标签: asp.net-mvc
2条回答
够拽才男人
2楼-- · 2020-02-24 01:25

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);
}
查看更多
冷血范
3楼-- · 2020-02-24 01:26

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)
查看更多
登录 后发表回答