Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC3-用于dropdownlist的列表信息在post后为空_Asp.net Mvc 3_Http Post_Html.dropdownlistfor - Fatal编程技术网

Asp.net mvc 3 MVC3-用于dropdownlist的列表信息在post后为空

Asp.net mvc 3 MVC3-用于dropdownlist的列表信息在post后为空,asp.net-mvc-3,http-post,html.dropdownlistfor,Asp.net Mvc 3,Http Post,Html.dropdownlistfor,我希望在视图中显示一个下拉列表,然后在我的模型(ExampleAddSetupDto)中包含一个发送到视图的条目列表,以填充下拉列表。这很好,但是如果我有一个验证错误并且在传入模型中重新显示视图,我的列表现在是空的 下面给出了我的操作(注意:如果ModelState.IsValid失败,则会出现问题)。另外,Action方法第二个参数可能看起来很奇怪,因为我正在使用Autofac将正确的服务注入该方法) 但这就产生了错误 “值”System.Collections.Generic.List“1[

我希望在视图中显示一个下拉列表,然后在我的模型(ExampleAddSetupDto)中包含一个发送到视图的条目列表,以填充下拉列表。这很好,但是如果我有一个验证错误并且在传入模型中重新显示视图,我的列表现在是空的

下面给出了我的操作(注意:如果ModelState.IsValid失败,则会出现问题)。另外,Action方法第二个参数可能看起来很奇怪,因为我正在使用Autofac将正确的服务注入该方法)

但这就产生了错误 “值”System.Collections.Generic.List“1[DataClasses.ExampleClasses.Option1]”无效。“”


很明显,我在这里遗漏了一些东西,我希望能得到一些关于如何返回列表的建议,以便重新显示模型不会导致错误

如果验证失败,则需要在dropdownlist中加载值列表。否则,它将失败

我相信,当您最初加载视图时,它会执行HttpGet方法。在HttpGet方法中,必须绑定Dropdownlist

当您提交页面时,它执行httpPost方法,若一切正常,它将提交。若验证失败,它将执行HTTPPost方法,但它找不到下拉列表的任何绑定

所以试试这个:在你的情况下

 if (ModelState.IsValid)
            {
                var response = service.Create(add);
                if (response.IsValid)
                {
                    TempData["message"] = "You successfully added a new Example Entry";
                    return View("AddSuccess", response);
                }

                //else errors, so copy the errors over to the ModelState
                response.CopyErrorsToModelState(ModelState, add);
            }
    else //if validation fails, you need to reload the dropdown and display your view.
      {
          // populate your dropdown again
              // You can add errors list into ModelState.
              ViewData.ModelState.AddModelError("What is the error", "Error Message, "What needs to be done by user, to get it work");
             return view(add)
      }

如果出于任何原因,您被迫在两个请求之间保留整个列表,我认为最好的方法是使用:

TempData["EnterUniqueKeyHere"] = PossibleEntriesForOption1;
要存储它,请执行以下操作:

PossibleEntriesForOption1 = TempData["EnterUniqueKeyHere"] as IList<Option1>;
PossibleEntriesForOption1=TempData[“EnterUniqueKeyHere”]作为IList;
去找回它


请注意,TempData中存储的任何内容都将在一次请求后自动删除。

在add的get操作中,您将使用以下两个属性的适当值创建模型:posibleEntriesProption 1和posibleEntriesProption 2 由于这些设置正确且在视图上可用,因此在get上正确呈现下拉列表

现在,当验证失败时,您必须再次设置这些属性

 if (ModelState.IsValid)
    {
        // Do something
    }

    // before you redisplay the same view
    // set the properties PosibleEntriesForOption1 & PosibleEntriesForOption2

    // Some validation error, so redisplay same view
    return View(add);

Dan Nixon的TempData技术只工作一次,但如果验证再次失败,TempData条目将为空。我想我也必须重新加载我的列表。

@jrummell:请查看我的更新答案,查看验证失败时显示的错误。你好,Hari。是的,我的初始视图专门填充PosibleentriesProption1和PosibleentriesProption2列表。我只是想把数据放回帖子里,但显然这不起作用。我将添加一个错误列表的重新填充。谢谢Dan。所有的答案都确认我需要在返回页面之前重新加载列表。有点遗憾,但事实就是这样。我非常喜欢你的答案Dan,因为它使用TempData,但我可能会在服务中修复它,因为我使用的是模板化服务。感谢Sandeep提供最新的答案。每个人都确认我不能从帖子中传回原始列表,所以我需要在帖子操作中重新加载列表。我只需要找出最好的位置,因为代码将从模板自动生成。刚刚找到答案,将您的值列表作为隐藏字段放在视图中,如下所示,它们将出现在您的帖子中:
@foreach(var location in Model.Locations){@Html.hidden(“Locations”,位置)}
 if (ModelState.IsValid)
            {
                var response = service.Create(add);
                if (response.IsValid)
                {
                    TempData["message"] = "You successfully added a new Example Entry";
                    return View("AddSuccess", response);
                }

                //else errors, so copy the errors over to the ModelState
                response.CopyErrorsToModelState(ModelState, add);
            }
    else //if validation fails, you need to reload the dropdown and display your view.
      {
          // populate your dropdown again
              // You can add errors list into ModelState.
              ViewData.ModelState.AddModelError("What is the error", "Error Message, "What needs to be done by user, to get it work");
             return view(add)
      }
TempData["EnterUniqueKeyHere"] = PossibleEntriesForOption1;
PossibleEntriesForOption1 = TempData["EnterUniqueKeyHere"] as IList<Option1>;
 if (ModelState.IsValid)
    {
        // Do something
    }

    // before you redisplay the same view
    // set the properties PosibleEntriesForOption1 & PosibleEntriesForOption2

    // Some validation error, so redisplay same view
    return View(add);