2016-03-20 2 views
0

Я использую расширения Devexpress MVC и пытаюсь выяснить другую проблему, упростив ее как можно больше. Согласно официальному сайту, он должен работать, но значение выбора не передается контроллеру.Простая форма регистрации не отправляет выбранное значение

Это модель и контроллер:

public class Fruit 
    { 
     public int value { get; set; } 
     public string name { get; set; } 
    } 

public ActionResult Index() 
     { 
     var model = new object[1]; 
     var fruits = new List(); 

     fruits.Add(new Fruit() { value = 1, name = "Apple" }); 
     fruits.Add(new Fruit() { value = 2, name = "Orange"}); 
     fruits.Add(new Fruit() { value = 3, name = "Lemon"}); 
     fruits.Add(new Fruit() { value = 4, name = "Pear" }); 
     fruits.Add(new Fruit() { value = 5, name = "Cherry" }); 

     model[0] = fruits; 
     return View(model); 
     } 

и Вид:

@using (Html.BeginForm("Create", "Home")) 
{ 
    @Html.DevExpress().FormLayout(settings => 
{ 
    settings.Name = "Myformlayout"; 
    settings.Width = 600; 
    var gi = settings.Items.AddGroupItem(gs => 
    { 
     gs.Caption = "TEST"; 
    }); 
    gi.Items.Add(item => 
    { 
     item.Name = "fruits"; 
     item.Caption = "Fruits"; 
     item.NestedExtensionType = FormLayoutNestedExtensionItemType.ComboBox; 
     ComboBoxSettings cbset = (ComboBoxSettings)item.NestedExtensionSettings; 
     cbset.Properties.TextField = "name"; 
     cbset.Properties.ValueField = "value"; 
     cbset.Properties.ValueType = typeof(int); 
     cbset.Properties.DropDownStyle = DropDownStyle.DropDownList; 
     cbset.Properties.DataSource = Model[0]; 
    }); 

    gi.Items.Add(item => 
    { 
     item.NestedExtensionType = FormLayoutNestedExtensionItemType.Button; 
     var btnset = (ButtonSettings)item.NestedExtensionSettings; 
     btnset.Name = "btnSubm"; 
     btnset.Text = "Send to ctrl"; 
     btnset.UseSubmitBehavior = true; 
    }); 
}).GetHtml(); 

Выбор работает нормально, но когда кнопка «Отправить Ctrl» щелкают я получаю «Словарь параметров содержит нулевую запись для параметра« id ». Контроллер« Home \ Create »ожидает параметр int id. Если я изменю требование параметра контроллера к int ?, вызов будет выполнен, поэтому выполняется работа.

Цель: отправить обратно контроллеру идентификатор выбранного фрукта (значение).

+0

Из того, что я вижу, у вас нет поля для идентификатора на вашем экране. Кстати, как реализовано действие Create? –

+0

Я не внедряю Create, просто хочу понять, как передать значение выделенного текста. Согласно демоверсии DevExpress, это должно сработать, так как вы определяете раскрывающийся список. – Paxsentry

ответ

0

Это дало мне ответ: https://documentation.devexpress.com/#AspNet/CustomDocument9151

Так контроллер выглядит следующим образом:

public ActionResult Create(MyModel item) 
     { 
     var x = EditorExtension.GetValue<int>("FruitId"); 

     return RedirectToAction("Index"); 
     } 

Спасибо за вашу помощь. Извините, я не знаю, чей ответ привел меня к желаемому решению. Взрывает для вас обоих!

1

Что вам нужно для достижения? Чтобы изменить поле вашей модели с помощью combobox? Если да, то я бы осуществить это следующим образом:

Модель:

public class MyModel { 
    public int FruitId { get; set; } 
    public MyModel() { 

    } 
} 

Контроллер:

public ActionResult Index() 
{ 
    var fruits = new List<Fruit>(); 

    fruits.Add(new Fruit() { id = 0, name = "Apple" }); 
    fruits.Add(new Fruit() { id = 1, name = "Orange" }); 
    fruits.Add(new Fruit() { id = 2, name = "Lemon" }); 
    fruits.Add(new Fruit() { id = 3, name = "Pear" }); 
    fruits.Add(new Fruit() { id = 4, name = "Cherry" }); 

    ViewBag.FruitSource = fruits; 
    return View(new MyModel()); 
} 

public ActionResult Create(int fruitId) { 
    return View(fruitId); 
} 

public class Fruit { 
    public int id { get; set; } 
    public string name { get; set; } 
} 

Вид:

@model DXWebApplication1.Models.MyModel 
@{ 
    ViewBag.Title = "Index"; 
} 

@using (Html.BeginForm("Create", "Home")) { 
    @Html.DevExpress().FormLayout(settings => { 
    settings.Name = "Myformlayout"; 
    settings.Width = 600; 
    var gi = settings.Items.AddGroupItem(gs => { 
     gs.Caption = "TEST"; 
    }); 
    gi.Items.Add(x => x.FruitId, item => { 
     item.Caption = "Fruits"; 
     item.NestedExtensionType = FormLayoutNestedExtensionItemType.ComboBox; 
     ComboBoxSettings cbset = (ComboBoxSettings)item.NestedExtensionSettings; 
     cbset.Properties.TextField = "name"; 
     cbset.Properties.ValueField = "id"; 
     cbset.Properties.ValueType = typeof(int); 
     cbset.Properties.DropDownStyle = DropDownStyle.DropDownList; 
     cbset.Properties.DataSource = ViewBag.FruitSource; 
    }); 

    gi.Items.Add(item => { 
     item.NestedExtensionType = FormLayoutNestedExtensionItemType.Button; 
     var btnset = (ButtonSettings)item.NestedExtensionSettings; 
     btnset.Name = "btnSubm"; 
     btnset.Text = "Send to ctrl"; 
     btnset.UseSubmitBehavior = true; 
    }); 
}).GetHtml(); 
} 

Итак, я связываю макет item для моей модели с использованием Lambda. Это имя поля (FruitId) будет именем параметра Create action.

+0

Спасибо, Гоша, по ссылке Мурата, если контроллер ожидает объект типа MyModel, то я вижу, что FruitId равен 0, а не null. Мне кажется, почему-то нет привязки к кнопке submit. – Paxsentry

+0

Мяч обновлен в исходном. – Paxsentry

+0

Если ваша цель - получить выбранный идентификатор фруктов, мое решение должно работать, не так ли? Продвинутый дизайн –