MVC4 Html.DropDownListFor如何列出编辑的所选项目

时间:2015-01-28 13:38:57

标签: asp.net-mvc-4 edit selected dropdownlistfor

我无法在任何符合我情况的地方找到任何示例(使用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中的默认选择设置为数据库中捕获的特定产品的现有值。

感谢您与一位毫无头绪的新手分享您的专业知识。

艾伦

2 个答案:

答案 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();
    }