【问题标题】:asp.net mvc4 dropdownlist returns model displayed in same viewasp.net mvc4 下拉列表返回显示在同一视图中的模型
【发布时间】:2013-02-19 13:42:17
【问题描述】:

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

控制器:

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

【问题讨论】:

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


    【解决方案1】:

    首先,原因

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

    因为,这个 DropdownList 将绑定来自 ViewBag/ViewData 的数据,名称 = "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 存储这些值。

    我希望这会有所帮助

    【讨论】:

    • 谢谢@hungdoan。虽然 #2 和 #3 有助于将来参考,但它并不能解决我在同一页面上显示退回产品的问题。在没有数据库支持的情况下这是非常基本的(使用 ProductList 类来模拟数据库)我尝试检查模型是否为空,例如 @if(!(Model.Equals(null))) 但这只是像其他所有的一样抛出和异常检查模型。有什么建议吗?
    • 您是否返回了您的视图与模型数据类似:return View(MyData);,然后通过这种方式绑定模型的数据类型:@model string(在您的 [View[.cshtml,..)中。或者您可以将您的数据绑定到 ViewBag(检查空值会更容易)
    【解决方案2】:

    你的例子有问题:

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

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

    【讨论】:

    • 感谢您的快速响应。不幸的是,我一定不会使用 ViewModel(此时)。我要做的是将下拉列表中的查找结果与下拉列表一起放置在同一页面(或显示时),以便第一次访问该页面时,您只能看到下拉列表并在选择某些产品后从它显示在下拉列表下方的下拉列表中。
    【解决方案3】:

    发生这种情况是因为您使用 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 1970-01-01
      • 2015-11-02
      • 2018-11-04
      • 1970-01-01
      • 2013-07-30
      • 2012-11-21
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多