2009-09-07 28 views
7

thực tiễn tốt nhất để gửi biểu mẫu trong asp.net mvc là gì. Tôi đã làm mã như thế này dưới đây nhưng tôi có một cảm giác có một cách tốt hơn. đề xuất?Bộ sưu tập hình thức asp.net mvc khi gửi

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

Trả lời

10

Bạn có thể sử dụng thông số trực tiếp; các tham số sẽ tự động được phân tích cú pháp và được đúc thành loại chính xác của nó. Tên tham số trong phương thức phải khớp với tên thông số được đăng từ biểu mẫu của bạn.

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

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

thường này hoạt động trên các đối tượng phức tạp hơn là tốt, miễn là thuộc tính của nó có thể được thiết lập, và miễn là phím hình thức của bạn đang trong objectName.PropertyName định dạng. Nếu bạn cần bất kỳ điều gì nâng cao hơn, bạn nên xem xét 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

Theo tôi, Trình kết nối mô hình sạch hơn. Bạn có thể tìm hiểu thêm tại OdeToCode.com

Về cơ bản, bạn đưa đầu vào của mình từ một FormCollection đến mô hình mong muốn cũng như xác thực.

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

Trong bộ điều khiển

public ActionResult AddNewLink(Link link) 
Các vấn đề liên quan