Передача нескольких результатов обратно в URL из представления в контроллер с помощью MVC из обернутого списка просмотра

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

В настоящее время я работаю над заполнением двух выпадающих списков в представлении с помощью одной кнопки отправки, которая будет проходить через выбранные элементы. Однако параметры в URL возвращаются как null при доступе через метод, хотя я вижу, что он заполнен в строке:

Ожидаемый URL:http://localhost:8080/store/DisplaySelection ?firstId=item1 amp; secondId=item 2

Но я получаю URL:http://localhost:8080/store/DisplaySelection ?firstList.firstId=item 1 amp; secondList.secondId=item 2

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

     public ActionResult DisplaySelection(string CatId, string BrandId)
    {
        ViewBag.catId = CatId;
        ViewBag.brandId = BrandId;
        return View(ViewBag);
    }
  

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

И примером может быть:

 public class SecondDropDownViewModel
{
    public string secondId { get; set; }
    public IEnumerable<SelectListItem> List { get; set; }
    public static List<SelectListItem> BuildSecondList(IEnumerable<Dtos.Second> second)
    {
        List<SelectListItem> items = new List<SelectListItem>();
        items.Add(new SelectListItem { Text = "item 1", Value = "itemd 1"
        items.Add(new SelectListItem { Text = "item 2", Value = "itemd 2"
        items.Add(new SelectListItem { Text = "item 3", Value = "itemd 3"

        return items;
    }
}

public class FirstDropDownViewModel
{
    public string firstId { get; set; }
    public IEnumerable<SelectListItem> List { get; set; }
    public static List<SelectListItem> BuildFirstList(IEnumerable<Dtos.First> first)
    {
        List<SelectListItem> items = new List<SelectListItem>();
        items.Add(new SelectListItem { Text = "item 1", Value = "itemd 1"
        items.Add(new SelectListItem { Text = "item 2", Value = "itemd 2"
        items.Add(new SelectListItem { Text = "item 3", Value = "itemd 3"

        return items;
    }
}

public class DropDownViewModel
{
    public FirstDropDownViewModel firstList { get; set; }
    public BrandDropDownViewModel secondist { get; set; }
}
  

Контроллер:

 public ActionResult Index()
{ DropDownViewModel vm = new DropDownViewModel();

        vm.firstList = new FirstDropDownViewModel
        {
            List = FirstDropDownViewModel.BuildFirstList()

        };
        vm.secondList = new SecondDropDownViewModel
        {
            List = SecondDropDownViewModel.BuildSecondList()
        };
        return View(vm); }
  

Вид:

 @using (Html.BeginForm("DisplaySelection", "store", FormMethod.Get)){
<fieldset>
        Grade Type
        @Html.DropDownListFor(m => m.firstList.CatId, Model.firsList.List, "--Select Category--")
        @Html.DropDownListFor(m => m.secondList.BrandId, Model.secondList.List, "--Select Brands--")
        <p>
            <input type="submit" value="Submit" />
        </p>
    </fieldset>
}
  

Комментарии:

1. Правильно сгенерируйте свою модель представления со свойствами string CatId и строкой BrandId для привязки к и IEnumerable<SelectListItem> CatList и IEnumerable<SelectListItem> BrandList (и никогда не пытайтесь изменить атрибут name, если вы не хотите испортить свое приложение)

Ответ №1:

Имя, которое генерируется как часть вашей формы, не имеет соответствующего свойства для привязки к действию, в котором вы принимаете ввод формы. Вместо этого попробуйте следующее, где вы добавляете параметр в DropDownListFor , чтобы указать имя:

 @Html.DropDownListFor(m => m.firstList.firstId, Model.firstList.List, "--Select Category--", new {Name= "CatId" })
@Html.DropDownListFor(m => m.secondist.secondId, Model.secondist.List, "--Select Brands--", new {Name= "BrandId" })
  

Если вы проверите HTML сгенерированной формы (нажмите F12), вы увидите, что имя формы в раскрывающемся списке выглядит примерно так object_propertyname . Ваша подпись в действии не имеет параметра, соответствующего этому имени, и у нее нет параметра с объектом, который имеет свойство с таким именем. Любой из них будет работать, как и изменение имени выше.

Кроме того, подумайте о том, чтобы отдать предпочтение POST перед GET , если действие, которое вы пишете, вызовет какие-либо изменения на сервере.