我在这里提出错误是没有'ienumerable< selectlistitem>类型的viewdata项目dropdownlistfor [英] I am geting error here is no viewdata item of type 'ienumerable<selectlistitem> dropdownlistfor

查看:83
本文介绍了我在这里提出错误是没有'ienumerable< selectlistitem>类型的viewdata项目dropdownlistfor的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试从下拉列表中保存数据时,它显示以下错误: - 这里没有类型'ienumerable dropdownlistfor的视图数据项目



这里是,y控制器< br $>


when i am trying save the data from dropdownlist it shows following error:- here is no viewdata item of type 'ienumerable dropdownlistfor

here is ,y controller

[HttpGet]
        public ActionResult register(tbl_state t)
        {
            eBusPassSystemEntities db = new eBusPassSystemEntities();
            IEnumerable<SelectListItem> item = db.tbl_state.Select(C => new SelectListItem
            {
                Value = C.state_name,
                Text = C.state_name

            });
            ViewBag.state = item;
            return View();
        }



 [HttpPost]
        public ActionResult Register(tbl_user u)
        {
            if (ModelState.IsValid)
            {
                using (eBusPassSystemEntities Db = new eBusPassSystemEntities())

                {
                    Db.tbl_user.Add(u);
                    Db.SaveChanges();

                }
                ModelState.Clear();
                ViewBag.message = "Hello" + u.name + " Your Account Has been Succesfully created.";
            }
            return View();
        }
    }
}





这是我的观点





here is my view

<div class="col-md-10">
                @Html.DropDownListFor(Model => Model.state, (IEnumerable<SelectListItem>)ViewBag.state, "Select state", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.state, "", new { @class = "text-danger" })
            </div>





我尝试了什么:



我正确得到我的下拉列表数据,我试过了但我无法保存数据,



基本上我试图从表中获取状态并希望在寄存器表中保存状态。

推荐答案

ViewBag 中的项目仅适用于单个请求。提交表单时,它由不同的操作处理。该操作返回相同的视图,但不会重新填充所需的 ViewBag 项目。



简单方法是在 HttpPost 操作中重新填充 ViewBag

Items in the ViewBag are only present for a single request. When you submit the form, it's handled by a different action. That action is returning the same view, but is not re-populating the required ViewBag items.

The simple approach is to re-populate the ViewBag in your HttpPost action:
[HttpGet]
public ActionResult register(tbl_state t)
{
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        ViewBag.state = db.tbl_state.Select(C => new SelectListItem
        {
            Value = C.state_name,
            Text = C.state_name
        }).ToList();
    }
    
    return View();
}

[HttpPost]
public ActionResult Register(tbl_user u)
{
    if (ModelState.IsValid)
    {
        using (eBusPassSystemEntities Db = new eBusPassSystemEntities())
        {
            Db.tbl_user.Add(u);
            Db.SaveChanges();
        }
        
        ModelState.Clear();
        ViewBag.message = "Hello" + u.name + " Your Account Has been Succesfully created.";
    }
    
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        ViewBag.state = db.tbl_state.Select(C => new SelectListItem
        {
            Value = C.state_name,
            Text = C.state_name
        }).ToList();
    }
    
    return View();
}



您可以将人口移动到单独的方法以避免代码重复:


You could move the population to a separate method to avoid code duplication:

private void PopulateLookups(eBusPassSystemEntities db)
{
    ViewBag.state = db.tbl_state.Select(C => new SelectListItem
    {
        Value = C.state_name,
        Text = C.state_name
    }).ToList();
}

[HttpGet]
public ActionResult register(tbl_state t)
{
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        PopulateLookups(db);
    }
    
    return View();
}

[HttpPost]
public ActionResult Register(tbl_user u)
{
    if (ModelState.IsValid)
    {
        using (eBusPassSystemEntities Db = new eBusPassSystemEntities())
        {
            Db.tbl_user.Add(u);
            Db.SaveChanges();
        }
        
        ModelState.Clear();
        ViewBag.message = "Hello" + u.name + " Your Account Has been Succesfully created.";
    }
    
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        PopulateLookups(db);
    }
    
    return View();
}



但通常,在执行插入/更新/删除操作后,您希望将用户重定向到其他操作。这样,如果他们点击浏览器的刷新按钮,它将不再尝试再次执行相同的操作。


But typically, after performing an insert/update/delete operation, you want to redirect the user to a different action. That way, if they hit the browser's "Refresh" button, it won't try to perform the same action again.

private void PopulateLookups(eBusPassSystemEntities db)
{
    ViewBag.state = db.tbl_state.Select(C => new SelectListItem
    {
        Value = C.state_name,
        Text = C.state_name
    }).ToList();
}

[HttpGet]
public ActionResult register(tbl_state t)
{
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        PopulateLookups(db);
    }
    
    return View();
}

[HttpPost]
public ActionResult Register(tbl_user u)
{
    if (!ModelState.IsValid)
    {
        using (eBusPassSystemEntities db = new eBusPassSystemEntities())
        {
            PopulateLookups(db);
        }
        
        return View();
    }
    
    using (eBusPassSystemEntities Db = new eBusPassSystemEntities())
    {
        Db.tbl_user.Add(u);
        Db.SaveChanges();
    }
    
    TempData["message"] = "Hello" + u.name + " Your Account Has been Succesfully created.";
    return RedirectToAction("Success");
}

[HttpGet]
public ActionResult Success()
{
    ViewBag.message = TempData["message"];
    return View();
}


这篇关于我在这里提出错误是没有'ienumerable&lt; selectlistitem&gt;类型的viewdata项目dropdownlistfor的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆