#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
, если действие, которое вы пишете, вызовет какие-либо изменения на сервере.