我一直试图弄清楚如何将从下拉列表中翻转的值传递回视图,并在结果中显示相同的下拉列表
控制器:
//
// GET: /ProductByID/
[HttpGet]
public ActionResult ProductById()
{
ViewBag.IDNumbers = ddlItems;
return View();
}
//
// POST: /ProductByID/
[HttpPost]
public ActionResult ProductById(FormCollection formdata)
{
string selected = formdata["IDNumbers"];
int id = int.Parse(selected);
Product p = items.GetByID(id);
return View(p);
}
观点:
@model ProductsMVC_Basic.Models.Product
@{
ViewBag.Title = "Product By Id";
}
<script src="~/Scripts/jquery-1.7.1.js"></script>
<script>
$(function () {
$("#IDNumbers").change(function () {
if ($("#IDNumbers").val() != "") {
this.form.submit();
}
});
});
</script>
<div>
@using (Html.BeginForm("ProductById", "Home", FormMethod.Post))
{
@Html.DropDownList("IDNumbers", "--Select One--")
}
</div>
这样可以填充下拉列表并将formdata发送回控制器。我的问题是如何在后期视图中显示模型数据,以便显示下拉列表,模型数据也会显示为名称和类别等。
每次我回发到同一个视图时,我都会收到一条错误,指出“没有类型'IEnumerable'的ViewData项具有'IDNumbers'键。”在PostView中。
答案 0 :(得分:1)
首先,
的原因“没有具有密钥的'IEnumerable'类型的ViewData项 'IDNumbers'“。
因为, DropdownList 会绑定来自ViewBag / ViewData的数据,名称为"IDNumbers"
在[发布]操作中,没有 Viewbag.IDNumbers ! =&GT;所以这就是你得到那个错误的原因。
解决方案:
1.收到数据后,请转到[GET] ProductById。
[HttpGet] public ActionResult ProductById(int iMyCode) { ViewBag.IDNumbers = ddlItems;//set your default value here return View(); }
2.使用网址Query String
删除您的网页,而不是提交表单。
3.通过Javascript在Client Side设置您的默认值(下拉列表),通过AJAX从服务器获取您的添加数据。通过Cookie / Session / Query String存储这些值。
我希望这会有所帮助
答案 1 :(得分:0)
您的示例存在问题:
FormCollection
。使用ViewModel并绑定到View中的ViewModel,然后将其作为[HttpPost]
操作方法中的参数接受。@Html.DropDownList
,请使用@Html.DropDownListFor(model => model.SomeDDl)
,其中SomeDddl
将是您的ViewModel上的SelectList
类型的属性(与2相关)。或许可以解释一下你想要实现的目标,而我(以及其他人)可以提供进一步的帮助。
答案 2 :(得分:0)
这是因为您使用ViewBag
来存储下拉列表值。
相反,如果您使用模型属性来绑定下拉列表,那么即使您发布数据也无法丢失DropDownList数据,这样会更好。
所以,答案是你也可以在帖子中使用ViewBag.IDNumbers = ddlItems
。
[HttpPost]
public ActionResult ProductById(FormCollection formdata)
{
ViewBag.IDNumbers = ddlItems; //Set the ViewBag items
string selected = formdata["IDNumbers"];
int id = int.Parse(selected);
Product p = items.GetByID(id);
return View(p);
}