我似乎找不到任何适合我的情况的示例(使用MVC4,只是使用存储过程直接从数据库获取数据,而不使用实体框架),将DropDownListFor的选定值设置为数据库中为该特定项列出的当前选定值)。
更具体地说,这里是我的代码的摘录(希望足以隔离这个无知的新手做错了什么)-希望能帮助其他正在努力将DropDownListFor中列出的默认值设置为正在编辑的数据库中已存储的值的人。
控制器
[HttpGet]
[Authorize]
public ActionResult Edit(string id, string ProdName, UpdateProductModel updateproductmodel)
{
int ProductID = Convert.ToInt32(id);
ViewBag.ProdName = ProdName;
SqlConnection cn = new SqlConnection(@"Data Source=D;User ID=user;Password=pswrd;Initial Catalog=cat");
SqlCommand cmd = new SqlCommand("sp_GetProduct", cn);
cn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@ProductID", ProductID));
SqlDataReader dr = cmd.ExecuteReader();
if (dr == null)
{
return HttpNotFound();
}
if (dr.Read())
{
DataSet dst = updateproductmodel.GetProducts_ByTypes();
ViewBag.UpProdTypes = dst.Tables[0];
List<SelectListItem> items = new List<SelectListItem>();
foreach (System.Data.DataRow dru in ViewBag.UpProdTypes.Rows)
{
items.Add(new SelectListItem { Selected = (Convert.ToInt32(@dru["ProdTypeID"].ToString()) == Convert.ToInt32(dr["ProdTypeID"].ToString())), Text = @dru["ProdTypeDescr"].ToString(), Value = @dru["ProdTypeID"].ToString() });
}
ViewBag.UpProdTypes = items;
if (Request.Cookies["OIDCookie"].Value == dr["OrganisationID"].ToString())
{
updateproductmodel.ProductID = Convert.ToInt32(dr["ProductID"].ToString());
updateproductmodel.ProdTypeID = Convert.ToInt32(dr["ProdTypeID"].ToString());
updateproductmodel.ProdTypeDescr = dr["ProdTypeDescr"].ToString();
updateproductmodel.ProductName = dr["ProductName"].ToString();
updateproductmodel.ProductDescription = dr["ProductDescription"].ToString();
updateproductmodel.ProductComments = dr["ProductComments"].ToString();
updateproductmodel.ProductProfileLocation = dr["ProductProfileLocation"].ToString();
updateproductmodel.ProductProfileName = dr["ProductProfileName"].ToString();
updateproductmodel.ProductMIMEType = dr["ProductMIMEType"].ToString();
updateproductmodel.ProductSerialNumber = dr["ProductSerialNumber"].ToString();
updateproductmodel.UpdateBy = Convert.ToInt32(Request.Cookies["UIDCookie"].Value);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
//dr.Close();
}
//dr.Close();
//cn.Close();
return View(updateproductmodel);
}
当我逐步完成这一步时,有一个阶段是Convert.ToInt32(dr"ProdTypeID".ToString()) -
(这是之前在数据库中为特定产品捕获的现有ProductTypeID的值)
是3(泵)和Convert.ToInt32(@dru"ProdTypeID".ToString() -
(这是一个表中产品类型的值,该表列出了在DropDownListFor中生成列表所需的各种产品类型)
也是3(泵)。
我假设这会导致ID为3的相关产品类型描述(即" PUMPS ")被设置为将在编辑视图中的DropDownListFor中显示的选定的缺省值-但是相反,只显示列表中的第一种类型,而没有选择的生效-并且当更新时,存储在DB中的值自然被设置为列表中的第一种类型的值(碰巧是分配器-而不是所需的泵-如果最初存在数据捕获错误,则显然可以改变为分配器-但显然,如果没有错误,它应该保持不变)。
视图(好吧,我假设这就是它所需要的全部)
<div class="editor-label">
@Html.LabelFor(model => model.ProdTypeID)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ProdTypeDescr) <br />
@Html.DropDownListFor(model => model.SelectedProdTypeID, (IEnumerable<SelectListItem>)ViewBag.UpProdTypes, new { @class="form-control"})
@Html.ValidationMessageFor(model => model.ProdTypeID)
</div>
我刚刚在DropDownListFor之前的视图中显示了Product Type值,以便进行简单的比较。每个视图中显示的值是否不同-一旦我获得DropDownListFor中列出的正确默认值,它显然就会被删除。
我已经注释掉了控制器操作底部的各种关闭,因为收到了需要打开连接的错误-在哪里以及什么时候关闭连接是安全的?(我显然不想积累从未关闭的开放连接)。
我非常感谢任何在编辑特定产品时将DropDownListFor中的默认选择设置为数据库中捕获的特定产品的现有值的建议。
感谢您与一位一无所知的新手分享您的专业知识。
艾伦
发布于 2015-01-28 14:16:06
使用SelectList
很可能你需要通过以下方式使用它的this contructor:
foreach (System.Data.DataRow dru in ViewBag.UpProdTypes.Rows)
{
items.Add(new SelectListItem {
Text = @dru["ProdTypeDescr"].ToString(),
Value = @dru["ProdTypeID"].ToString()
});
}
ViewBag.UpProdTypes = new SelectList(items,"Value","Text", "3");
现在,在下拉列表中,您将在视图中选择项,其值为3
,表示ProdTypeID
3。
在视图中:
@Html.DropDownListFor(model => model.SelectedProdTypeID,
ViewBag.UpProdTypes as SelectList,
new { @class="form-control"})
发布于 2016-05-05 04:17:04
public ActionResult Create()
{
ViewBag.int_usertype_id = new SelectList(db.tbl_usertype.Where(x => x.int_usertype_id != 4).ToList(), "int_usertype_id", "Str_usertype");
return View();
}
https://stackoverflow.com/questions/28193683
复制