我无法在任何符合我情况的地方找到任何示例(使用MVC4直接从数据库中使用存储过程而不使用实体框架获取数据)将DropDownListFor的SELECTED值设置为当前选定的值列出的数据库中的特定项目。
更具体地说,这里是我的代码的摘录(希望足以隔离这个无知的新手做错了什么) - 这将有助于其他任何人努力将DropDownListFor中的默认列出值设置为已存储在DB中的内容正在编辑的内容。
CONTROLLER
[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);
}
当我单步执行此操作时,会有一个转换为.ToInt32的阶段(dr [&#34; ProdTypeID&#34;]。ToString()) -
(这是以前在特定产品的数据库中捕获的现有ProductTypeID的值)
是3(Pumps)和Convert.ToInt32的值(@dru [&#34; ProdTypeID&#34;]。ToString() -
(这是表中列出了各种产品类型的产品类型的值,这些产品类型通过迭代来生成DropDownListFor中的列表)
也是3(Pumps)。
我认为这会导致ID为3的相关产品类型描述(即&#34; Pumps&#34;)被设置为在EDIT视图中显示在DropDownListFor中的所选默认值 - 但是相反,只显示列表中的第一个类型,而没有SELECTED生效 - 并且当更新时,存储在DB中的值自然会被设置为列表中第一个类型的值(恰好是DISPENSERS - 而不是期望的PUMPS - 如果最初有数据捕获错误,显然可以更改为DISPENSERS - 但显然它应该保持原样,如果没有错误的话。)
VIEW(我所假设的就是它所需的一切)
<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之前的视图中显示了产品类型的值,以便进行简单的比较,检查每个显示的值是否有所不同 - 显然我会在删除后立即将其删除在DropDownListFor。
中我已经在控制器操作底部注释掉了各种Closes,因为收到了一个需要打开连接的错误 - 关闭连接是否安全?WHERE和WHEN是否安全? (我显然不想累积永不关闭的开放连接。)
我真的很感激任何建议,在编辑特定产品时,将DropDownListFor中的默认选择设置为数据库中捕获的特定产品的现有值。
感谢您与一位毫无头绪的新手分享您的专业知识。
艾伦
答案 0 :(得分:1)
使用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"})
答案 1 :(得分:0)
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();
}