无法将ListItem转换为Car类:WebForms下ListBox取值问题求助
解决WebForms中ListBox SelectedItem无法转换为Car类型的问题
这个报错很典型——你直接把ListBox的SelectedItem(它是ListItem控件类型)当成业务对象Car来转换,这俩完全是不同的类型,没有继承或转换关系,自然会失败。下面给你几种常用的解决方案,根据你当初绑定ListBox的方式选就行:
方案1:通过ID重新查询Car对象(最常用)
如果绑定ListBox时,你把Car的唯一标识(比如ID)存在了ListItem.Value里,显示的名称存在Text里,那可以这么做:
if (lbxCars.SelectedItem != null) { // 先取出选中项的ID值(注意根据你的ID类型调整转换方式,比如string转int/guid) int selectedCarId = int.Parse(lbxCars.SelectedItem.Value); // 调用你的数据查询方法,根据ID获取完整的Car对象 // 这里的GetCarById是你自己实现的方法,比如从数据库/缓存里查询 Car tempCar = GetCarById(selectedCarId); // 存入Session供其他页面使用 if (tempCar != null) { Session["SelectedCar"] = tempCar; } }
方案2:从绑定的数据源中匹配Car对象
如果当初绑定ListBox时,你把完整的Car列表存在了ViewState或者Session里,可以直接从数据源中匹配:
// 先假设你绑定的时候把Car列表存在了ViewState里(绑定代码示例) // List<Car> carList = GetAllCars(); // ViewState["CarList"] = carList; // lbxCars.DataSource = carList; // lbxCars.DataTextField = "CarName"; // 显示的属性 // lbxCars.DataValueField = "Id"; // 存ID到Value // lbxCars.DataBind(); // 现在获取选中的Car if (lbxCars.SelectedItem != null) { int selectedCarId = int.Parse(lbxCars.SelectedItem.Value); List<Car> carList = (List<Car>)ViewState["CarList"]; // 从列表中找到对应ID的Car Car tempCar = carList.FirstOrDefault(car => car.Id == selectedCarId); if (tempCar != null) { Session["SelectedCar"] = tempCar; } }
方案3:序列化Car对象到ListItem的属性中
如果不想重新查询或存储数据源,可以在绑定的时候把Car对象序列化后存在ListItem的自定义属性里:
// 绑定时候的代码(需要引用Newtonsoft.Json包) foreach (Car car in GetAllCars()) { ListItem item = new ListItem(car.CarName, car.Id.ToString()); // 把Car对象序列化为JSON字符串存在Attributes里 item.Attributes["CarData"] = Newtonsoft.Json.JsonConvert.SerializeObject(car); lbxCars.Items.Add(item); } // 获取选中Car的代码 if (lbxCars.SelectedItem != null) { string carJson = lbxCars.SelectedItem.Attributes["CarData"]; Car tempCar = Newtonsoft.Json.JsonConvert.DeserializeObject<Car>(carJson); Session["SelectedCar"] = tempCar; }
核心思路就是:ListItem是Web控件的项,不是你的业务对象,必须通过绑定过程中存储的标识或序列化数据,重新还原出Car对象,再存入Session。
内容的提问来源于stack exchange,提问作者user5582406
相关产品推荐
相关产品推荐

