2009-09-07 2 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

На мой взгляд, модель Binder является более чистым. Вы можете узнать больше на странице 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) 
Смежные вопросы