通过URL从视图传递多个结果到控制器与MVC从包装selectViewList

本文关键字:控制器 包装 selectViewList 结果 MVC 视图 URL 通过 | 更新日期: 2023-09-27 18:13:41

我目前正在用一个提交按钮填充视图中的两个下拉列表,该按钮将通过所选内容。然而,url中的参数在通过方法访问时返回为空,尽管我可以看到它在字符串中填充:

将URL:http://localhost: 8080/商店/DisplaySelection ? firstId = item1& secondId =产品+ 2

但是我得到的URL是:http://localhost: 8080/商店/DisplaySelection ? firstList.firstId =产品+ 1,secondList.secondId =产品+ 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>
}

通过URL从视图传递多个结果到控制器与MVC从包装selectViewList

作为表单的一部分生成的名称在接受表单输入的操作中没有相应的属性来绑定。试试下面的方法,向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