0

我正在使用 asp.net mvc 2,我发现了我无法理解的这种行为。
我有以下观点:

<%  using (Html.BeginForm("Index", "BlackListGrabber", FormMethod.Post) )
    {           
<%= Html.DropDownListFor(m => m.selectedArea, new SelectList(Model.areaList, "value", "text")) %>

<%  if (Model.districtList != null) { %>  
<%= Html.DropDownListFor(m => m.selectedDistrict, new SelectList(Model.districtList, "value", "text")) %>
<% } %>

<%  if (Model.townList!= null) { %>  
<%= Html.DropDownListFor(m => m.selectedTown, new SelectList(Model.townList, "value", "text")) %>
<% } %>  

<input type="submit" value="post" />
<% } %>

和控制器的方法是这样的:

[HttpPost]
public ActionResult Index(BlackListGrabberModel postedModel)
{
    BlackListGrabberModel model = new BlackListGrabberModel(postedModel);            
    return View(model);
}

最后但并非最不重要的是,我的模型:

BlackListGrabberModel(BlackListGrabberModel model)
{
    if (string.IsNullOrEmpty(model.selectedArea))
    {
        areaList = GetRegions();
    }
    else if (string.IsNullOrEmpty(model.selectedDistrict))
    {
        areaList = model.areaList;
        districtList = GetRegions(model.selectedArea);
    }
    else if (string.IsNullOrEmpty(model.selectedTown))
    {
        areaList = model.areaList;
        districtList = model.districList;
        districtList = GetRegions(model.selectedDistrict);
    }
}

想法是然后我加载页面,我看到所有可能区域的列表。(我看到了 - 这是我的第一个下拉列表)当我选择区域时,单击“发布”按钮后,我看到所有区域的列表,它们从外部加载来源,这部分工作正常。

所以我从列表中选择地区,然后单击“发布”。之后我看到位于选定地区的所有城镇的列表,但 DistrictList 消失了。然后我在我的控制器中跟踪它,我发现属性postedModel.districtList 为空。但是postedModel.areaList 没问题!这是否意味着我只能发布一个 SelectList,或者我错过了什么?有人可以给我任何帮助吗?
PS属性“selectedArea”、“selectedDistrict”、“selectedTown”按预期发布。

编辑。感谢大家,我错过了一些重要的事情,你们给了我方向。
我的问题似乎是 areaList。它由默认构造函数填充。我忘记了这一点,所以后来我看到了postedModel.areaList 填充,我认为它是由asp.net mvc 机制神奇地发布的,并抱怨由于一些奇怪的问题而没有填充所有其他列表。

4

2 回答 2

1

您必须为每个请求重新填充模型中的列表属性。不会自动回发。只有选定的值被回发并绑定到模型中的属性(即已selectedArea绑定但未绑定areaList)。

于 2012-12-03T13:01:05.297 回答
1

列表不应该发布,只有您的 html 表单中的选择元素的值才会发布。如果您需要保留列表值,您可以尝试将它们放在您的 GET for Index 中的 TempData 中,这将为下一个请求保留它们。

于 2012-12-03T13:03:42.793 回答