asp.net mvc4 dropdownlist返回在同一视图中显示的模型

时间:2013-02-19 00:51:40

标签: razor asp.net-mvc-4 html-select

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

控制器:

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

3 个答案:

答案 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)

您的示例存在问题:

  1. 不知道你想要实现什么,但看起来你已经陷入了ASP.NET Web Forms“回发”模型。每次DDL更改时都无需提交表单。更好的方法是通过AJAX将产品ID传递给服务器,并对响应做一些事情。
  2. 请勿使用FormCollection。使用ViewModel并绑定到View中的ViewModel,然后将其作为[HttpPost]操作方法中的参数接受。
  3. 请勿使用@Html.DropDownList,请使用@Html.DropDownListFor(model => model.SomeDDl),其中SomeDddl将是您的ViewModel上的SelectList类型的属性(与2相关)。
  4. 或许可以解释一下你想要实现的目标,而我(以及其他人)可以提供进一步的帮助。

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