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

Razor asp.net mvc4 dropdownlist返回在同一视图中显示的模型,razor,asp.net-mvc-4,html-select,Razor,Asp.net Mvc 4,Html Select,我一直在试图找出如何将从dropdownlist重新读取的值传递回一个视图,该视图将显示相同的dropdownlist和结果 控制器: // // GET: /ProductByID/ [HttpGet] public ActionResult ProductById() { ViewBag.IDNumbers = ddlItems; return View(); } // // POST: /ProductByID/ [HttpPost] public ActionRe

我一直在试图找出如何将从dropdownlist重新读取的值传递回一个视图,该视图将显示相同的dropdownlist和结果

控制器:

//
// 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>
这可以填充dropdownlist并将formdata发送回控制器。我的问题是如何在post视图中显示模型数据,以便显示下拉列表,并显示模型数据,如名称和类别等


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

您的示例存在问题:

不知道您想要实现什么,但看起来您陷入了ASP.NET Web表单回发模型。无需在每次DDL更改时提交表单。更好的方法是通过AJAX将产品ID传递给服务器,并对响应进行处理。 不要使用FormCollection。使用ViewModel并绑定到视图中的ViewModel,然后在[HttpPost]操作方法中将其作为参数接受。 不要使用@Html.DropDownList,使用@Html.DropDownListFormodel=>model.SomeDDl,其中SomeDddl将是与上述2相关的ViewModel上SelectList类型的属性。
所以,也许可以解释一下你想要达到的目标,我和其他人可以提供进一步的帮助。

首先,我要说明

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

因为,此下拉列表将绑定名为IDNumbers的ViewBag/ViewData中的数据

在[Post]操作中,没有Viewbag.idNumber!=>这就是为什么你会犯这个错误

解决方案:

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

2.使用URL查询字符串而不是提交表单重新加载页面

3.使用Javascript在客户端设置默认值下拉列表,通过AJAX从服务器获取添加数据。按Cookie/Session/Query字符串存储这些值


我希望这会有所帮助,因为您正在使用ViewBag存储dropdownlist值

相反,如果您使用模型属性绑定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);
}

谢谢你的快速回复。不幸的是,我现在肯定不会使用ViewModel。我想做的是将dropdownlist中的查找结果放在同一页面上,或者与dropdownlist一起显示,这样第一次访问页面时,您只会看到dropdownlist,从dropdownlist中选择一些产品后,它会显示在dropdownlist下面。谢谢@hungdoan。虽然2和3有助于将来参考,但在同一页面上显示退货产品并不能解决我的问题。这是非常基本的,没有数据库支持,使用ProductList类来模拟数据库。我尝试检查模型是否为null,例如@if!Equalsnull,但这只是抛出和异常,就像对模型的每一次检查一样。有什么建议吗?您是否使用模型数据返回视图,如:return ViewMyData,然后通过以下方式绑定模型的数据类型:@Model string在[View[.cshtml,…]中,或者您可以将数据绑定到ViewBag,这样可以更容易地检查null值
[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);
}