ASP.Net MVC:下拉列表中未显示任何城市数据
本文关键字:显示 任何 城市 数据 Net MVC 下拉列表 ASP | 更新日期: 2023-09-27 18:29:55
我正在通过Webgrid显示数据。 Webgrid具有文本框和下拉列表,可显示每个学生的姓名,州,城市等。 我的代码有效,但为每个学生显示错误的选定城市。 为了便于测试,我手动填充了我的视图模型。 在这里,我正在粘贴我的代码。 如果可能的话,请看一下,让我知道显示错误城市的原因。 代码中要更改的内容。我的完整代码在这里
我的 dotnet 小提琴链接 https://dotnetfiddle.net/BrKBx1
请不要告诉我更改模型类设计代码。
视图模型和模型
public class MainViewModel
{
public List<Student> Students { get; set; }
public int SelectedState { get; set; }
public int SelectedCity { get; set; }
}
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public int StateID { get; set; }
public int CityID { get; set; }
public List<States> States { get; set; }
public List<Cities> Cities { get; set; }
}
public class States
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Cities
{
public int ID { get; set; }
public string Name { get; set; }
public int StateID { get; set; }
}
控制器
public ActionResult Index()
{
MainViewModel oVm = new MainViewModel()
{
Students = new List<Student>() {
new Student
{
ID=1,
Name="JoyDev",
StateID=1,
CityID=1,
States=new List<States>()
{
new States
{
ID=1,
Name="WestBengal",
},
new States
{
ID=2,
Name="Bihar",
},
new States
{
ID=3,
Name="Orrisa",
}
},
Cities=new List<Cities>()
{
new Cities
{
ID=1,
Name="Alipur"
},
new Cities
{
ID=2,
Name="Asansol"
},
new Cities
{
ID=3,
Name="Andul"
}
}
},
//***********
new Student
{
ID=2,
Name="Mukti",
StateID=2,
CityID=4,
States=new List<States>()
{
new States
{
ID=1,
Name="WestBengal",
},
new States
{
ID=2,
Name="Bihar",
},
new States
{
ID=3,
Name="Orrisa",
}
},
Cities=new List<Cities>()
{
new Cities
{
ID=4,
Name="Janpur"
},
new Cities
{
ID=5,
Name="Madhubani"
},
new Cities
{
ID=6,
Name="Kanti"
}
}
},
//***********
new Student
{
ID=3,
Name="Somnath",
StateID=3,
CityID=9,
States=new List<States>()
{
new States
{
ID=1,
Name="WestBengal",
},
new States
{
ID=2,
Name="Bihar",
},
new States
{
ID=3,
Name="Orrisa",
}
},
Cities=new List<Cities>()
{
new Cities
{
ID=7,
Name="Chandapur"
},
new Cities
{
ID=8,
Name="Dhankauda"
},
new Cities
{
ID=9,
Name="Konarak"
}
}
}
}
};
return View(oVm);
}
查看代码
@model BuildTable.Models.MainViewModel
@{
ViewBag.Title = "Test Grid";
}
@{
WebGrid grid = new WebGrid(null);
grid.Bind(Model.Students);
}
@grid.GetHtml(
tableStyle: "webgrid-table",
headerStyle: "webgrid-header",
footerStyle: "webgrid-footer",
alternatingRowStyle: "webgrid-alternating-row",
selectedRowStyle: "webgrid-selected-row",
rowStyle: "webgrid-row-style",
mode: WebGridPagerModes.All,
firstText: "<<",
previousText: "<",
nextText: ">",
lastText: ">>",
numericLinksCount: 5,
columns:
grid.Columns
(
grid.Column(columnName: "ID", header: "ID", format: @<text>@item.ID</text>,style:"SmallCols"),
grid.Column(columnName: "FirstName", header: "First Name", format: @<text><input type="text" id="txtFirstName" value="@item.Name" class="edit-mode" /></text>,style:"NameColWidth" ),
//grid.Column(columnName: "StateName", header: "State Name", format: @<text>@Html.DropDownListFor(x => x.SelectedState, new SelectList(Model.Students[1].States, "ID", "Name", Model.SelectedState = item.StateID), "-- Select States--", new { id = "cboState", @class = "edit-mode" })</text>,style:"NameColWidth"),
grid.Column(columnName: "StateName", header: "State Name", format: @<text>@Html.DropDownListFor(x => x.SelectedState, new SelectList(Model.Students.SelectMany(x => x.States).Where(x => x.StateID == item.StateID), "ID", "Name", Model.SelectedState = item.StateID), "-- Select States--", new { id = "cboState", @class = "edit-mode" })</text>,style:"NameColWidth"),
grid.Column(columnName: "CityName", header: "City Name", format: @<text>@Html.DropDownListFor(x => x.SelectedCity, new SelectList(Model.Students.SelectMany(x => x.Cities).Where(x => x.ID == item.StateID), "ID", "Name", Model.SelectedCity = item.CityID), "-- Select City--", new { id = "cboCity", @class = "edit-mode" })
</text>,style:"NameColWidth")
))
我们不能这样过滤吗(Model.Students.SelectMany(x => x.Cities).Where(x => x.StateID == item.StateID)
上面的代码返回每个 studen 的所有城市数据,我正在根据州 ID 过滤城市。 如果这不正确代码来做到这一点,然后建议我写什么来实现相同的目的。谢谢
您从未设置任何城市的StateID
,因此如果您按 StateID == item.StateID
过滤,则永远不会有匹配项。
在控制器中,您需要这样的东西:
Cities = new List<Cities>()
{
new Cities
{
ID = 4,
StateID = 1, // add this!
Name = "Janpur"
},
new Cities
{
ID = 5,
StateID = 2, // add this!
Name = "Madhubani"
},
new Cities
{
ID = 6,
StateID = 3, // add this!
Name = "Kanti"
}
}
此外,我建议将SelectLists
放入视图模型中,而不是在视图中创建它们。这将使您的代码更易于阅读,并且从概念上讲,SelectList
实际上是一种支持视图的模型类型,而不是视图本身。
这是一个更新的小提琴:https://dotnetfiddle.net/UYpO9m
因为您的Where
呼叫是在SelectMany
之后进行的。在这一点上,你所拥有的只是一个Cities
的集合,所以当你按x.ID == item.StateID
过滤它时,你说只返回Cities.ID
等于item.StateID
的Cities
实例。根据测试数据,不执行任何操作,因此不会返回任何内容。通常情况下,您只需将Where
调用移动到SelectMany
调用之前,然后将表达式更改为x.StateID == item.StateID
。