0

我在 View 中填充 DropDownList 并在 POST 上收到此错误。

错误:没有具有键“SelectedCityName”的“IEnumerable”类型的 ViewData 项。

控制器:

 public ViewResult Register()
    {
        var Cities = ILocaRepo.Cities.ToList(); 
        var Wards = ILocaRepo.Wards.ToList() ;
        var model = new RegisterViewModel
        {
            City = Cities.Select(x => new SelectListItem
            {
                Value = x.CityID.ToString(),
                Text = x.CityName
            }),
            Ward = Wards.Select(x => new SelectListItem
            {
                Value = x.WardID.ToString(),
                Text = x.WardName
            })
        };
        return View(model);
    }

    //
    // POST: /Account/Register
    [HttpPost]
    public ActionResult Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {

            // Attempt to register the user
            try
            {
                MembershipService.CreateUser(model.User.Username, model.User.Password, model.User.Name, model.SelectedCityName, model.SelectedWardName, model.User.Address, model.User.Phone, model.User.Email, "Member");
                FormsAuthentication.SetAuthCookie(model.User.Username, false);
                return RedirectToAction("ListProduct", "Product");
            }
            catch (ArgumentException ae)
            {
                ModelState.AddModelError("", ae.Message);
            }
        }


            // If we got this far, something failed, redisplay form
            return View(model);

    }

看法 :

 <tr>
                <td class="info_label">City</td>
                <td>@Html.DropDownListFor(m=>m.SelectedCityName,Model.City,"-- Chọn thành phố --",new { @class = "dropdown" })</td>
            </tr>
             <tr>
                <td class="info_label">Ward</td>
                <td>@Html.DropDownListFor(m => m.SelectedWardName, Model.Ward, "-- Chọn quận --", new { @class = "dropdown" })</td>
            </tr>

和视图模型:

 public User User { get; set; }
    public string SelectedCityName { get; set; }
    public string SelectedWardName { get; set; }
    public IEnumerable<SelectListItem> City { get; set; }
    public IEnumerable<SelectListItem> Ward { get; set; }

如何让 SelectedCityName 作为 RegisterUser 方法的参数传递?任何帮助表示赞赏。

4

1 回答 1

1

在您的 POST 操作中,您将呈现相同的视图以防出现错误 ( return View(model);)。但是您忘记分配CityandWard属性,就像您在 GET 操作中所做的那样,并且在呈现此视图时它们将为空。

所以:

// If we got this far, something failed, redisplay form

// and don't forget to rebind City and Ward
model.City = ILocaRepo.Cities.ToList().Select(x => new SelectListItem
{
    Value = x.CityID.ToString(),
    Text = x.CityName,
});
model.Ward = ILocaRepo.Wards.ToList().Select(x => new SelectListItem
{
    Value = x.WardID.ToString(),
    Text = x.WardName,
});

// Now we can safely redisplay the same view
return View(model);

这两个属性在 POST 操作中为空的原因非常简单,并且在于 HTML 表单的设计。在 HTML 中,当您提交包含<select>元素的表单(这是那些Html.DropDownListFor助手正在生成的)时,只有选定的值会发送到服务器。可用值的列表不会发送到服务器,因为它假定您已经在服务器的某个地方拥有它(因为您首先呈现了此表单)。因此,如果您决定在 POST 操作中重新显示表单,则您有责任重新填充这些集合,以便能够正确显示下拉列表。

于 2013-08-06T09:12:35.617 回答