首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVC4 Html.DropDownListFor如何列出要编辑的选定项目

MVC4 Html.DropDownListFor如何列出要编辑的选定项目
EN

Stack Overflow用户
提问于 2015-01-28 21:38:57
回答 2查看 5.3K关注 0票数 1

我似乎找不到任何适合我的情况的示例(使用MVC4,只是使用存储过程直接从数据库获取数据,而不使用实体框架),将DropDownListFor的选定值设置为数据库中为该特定项列出的当前选定值)。

更具体地说,这里是我的代码的摘录(希望足以隔离这个无知的新手做错了什么)-希望能帮助其他正在努力将DropDownListFor中列出的默认值设置为正在编辑的数据库中已存储的值的人。

控制器

代码语言:javascript
运行
复制
[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中的值自然被设置为列表中的第一种类型的值(碰巧是分配器-而不是所需的泵-如果最初存在数据捕获错误,则显然可以改变为分配器-但显然,如果没有错误,它应该保持不变)。

视图(好吧,我假设这就是它所需要的全部)

代码语言:javascript
运行
复制
<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中的默认选择设置为数据库中捕获的特定产品的现有值的建议。

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

艾伦

EN

回答 2

Stack Overflow用户

发布于 2015-01-28 22:16:06

使用SelectList很可能你需要通过以下方式使用它的this contructor

代码语言:javascript
运行
复制
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。

在视图中:

代码语言:javascript
运行
复制
 @Html.DropDownListFor(model => model.SelectedProdTypeID,
                                ViewBag.UpProdTypes as SelectList, 
                                new { @class="form-control"})
票数 1
EN

Stack Overflow用户

发布于 2016-05-05 12:17:04

代码语言:javascript
运行
复制
    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();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28193683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档