0

我一直在试图弄清楚如何将从下拉列表中重读的值传递回与结果显示相同的下拉列表的视图

控制器:

//
// 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>

这可以填充下拉列表并将表单数据发送回控制器。我的问题是如何在帖子视图中显示模型数据,以便显示下拉菜单,并且模型数据也显示为名称和类别等。

每次我发回同一个视图时,我都会收到一条错误消息,指出“没有具有键 'IDNumbers' 的 'IEnumerable' 类型的 ViewData 项。” 在 PostView 中。

4

3 回答 3

1

首先,原因

“没有具有键 'IDNumbers' 的 'IEnumerable' 类型的 ViewData 项。”

因为,这个DropdownList将绑定来自 ViewBag/ViewData 的数据 name ="IDNumbers"

在您的 [Post]Action 中,没有Viewbag.IDNumbers!=> 所以这就是你得到那个错误的原因。

解决方案:

1.收到数据后重定向到[GET] ProductById。

[HttpGet]
public ActionResult ProductById(int iMyCode)
{
    ViewBag.IDNumbers = ddlItems;//set your default value here
    return View();
}

2.使用 URL 重新加载您的页面,Query String而不是提交表单。

3.通过Javascript在客户端设置您的默认值(下拉列表),通过AJAX从服务器获取您的附加数据。通过 Cookie/Session/Query String 存储这些值。

我希望这个能帮上忙

于 2013-02-19T02:13:02.067 回答
0

您的示例存在问题:

  1. 不知道您要实现什么,但看起来您陷入了 ASP.NET Web 窗体“回发”模型。无需在每次 DDL 更改时提交表单。更好的方法是通过 AJAX 将产品 ID 传递给服务器并对响应进行处理。
  2. 不要使用FormCollection. 使用 ViewModel 并绑定到您的视图中,然后将其作为[HttpPost]操作方法中的参数接受。
  3. 不要使用@Html.DropDownList, use @Html.DropDownListFor(model => model.SomeDDl), whereSomeDddl将是SelectList您的 ViewModel 上的类型属性(与上面的 2 相关)。

所以也许解释一下你想要达到的目标,我(和其他人)可以提供进一步的帮助。

于 2013-02-19T01:17:50.720 回答
0

发生这种情况是因为您正在使用ViewBag存储下拉列表值。

相反,如果您使用模型属性绑定 Dropdownlist,即使发布数据也不会丢失 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);
}
于 2013-02-19T05:42:17.380 回答