2009-09-07 52 views
7

在asp.net mvc中提交表單的最佳做法是什麼?我一直在做這樣的代碼,但我有一種感覺,有一個更好的方法。建議?提交時提交asp.net mvc表單集合

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

回答

10

您可以直接使用參數;參數將自動被解析並轉換爲正確的類型。方法中的參數名稱必須與從表單發佈的參數名稱相匹配。

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

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

這一般適用於更復雜的對象以及,只要它的屬性進行設置,只要你的形式鍵格式objectName.PropertyName。如果你需要更先進的東西,你應該看看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

在我看來,模型粘結劑更清潔。您可以通過OdeToCode.com

瞭解更多信息基本上,您可以將來自FormCollection的輸入封裝爲期望的模型以及驗證。

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

在控制器

public ActionResult AddNewLink(Link link)