为什么 DropDownListFor 帮助程序在验证错误后失败

本文关键字:错误 失败 验证 DropDownListFor 帮助程序 为什么 | 更新日期: 2023-09-27 18:30:18

在这里呆了太久了!关于以下问题的任何建议...

添加的代码:

模型

:帐户模型.cs

[Required]
[Display(Name = "Select role: ")]
public String Role { get; set; }
控制器

:帐户控制器.cs

  // GET: /Account/Register
public ActionResult Register()
{ 
    List<SelectListItem> list = new List<SelectListItem>();
    SelectListItem item; 
    foreach (String role in Roles.GetAllRoles()) 
    { 
        item = new SelectListItem { Text = role, Value = role }; 
        list.Add(item); 
    }
    ViewBag.roleList = (IEnumerable<SelectListItem>)list;
    return View();
}

同样在[HTTpPost]中

if (createStatus == MembershipCreateStatus.Success)
{
    Roles.AddUserToRole(model.UserName, model.Role);
    MailClient.SendWelcome(model.Email);
    FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
    return RedirectToAction("Create", "Customers");
}

查看: 注册.cshtml

<div class="editor-label">      
    @Html.LabelFor(m => m.Role)  
</div>      
<div class="editor-field">
    @Html.DropDownListFor(m => m.Role, ViewBag.roleList as IEnumerable<SelectListItem>)

该代码有效并允许用户选择一个角色,但如果用户在创建新帐户时违反验证规则,则该代码就会崩溃。

示例:如果密码与正常不匹配,验证将启动,但由于添加了新代码,应用程序就会崩溃。

创建错误的代码:

@Html.DropDownListFor(m => m.Role, ViewBag.roleList as IEnumerable<SelectListItem>)

错误代码

具有键"角色"的 ViewData 项的类型为"System.String",但必须为"IEnumerable"类型。

为什么 DropDownListFor 帮助程序在验证错误后失败

我想您在 HttpPost 操作方法

中验证失败时会遇到此问题。 我相信您在 HttpPost 操作方法中有return View()语句。当您再次返回视图时,您的视图数据为空。因此,您需要再次为下拉列表重新加载数据

public ActionResult Register()
{
 //If validation ok, save
 if (createStatus == MembershipCreateStatus.Success)
 {
   //dio stuff
 }
 else
 { 
    List<SelectListItem> list = new List<SelectListItem>();
    SelectListItem item; 
    foreach (String role in Roles.GetAllRoles()) 
    { 
        item = new SelectListItem { Text = role, Value = role }; 
        list.Add(item); 
    }
    ViewBag.roleList = (IEnumerable<SelectListItem>)list; 
    return View();
 }
}

理想情况下,我不会将 ViewData 用于处理此内容。我将有我的视图模型来处理这个问题。

public class RegisterViewModel
{
 public string FirstName { set;get;} 
 public IEnumerable<SelectListItem> Roles { get; set; }
 public int SelectedRoleId { get; set; }
}

并在获取操作调用中,将视图模型传递回视图。

public ActionResult Register()
{
  RegisterViewModel objViewModel=new RegisterViewModel();
  objViewModel.Roles=GetAllRolesAs();  // returns the list of roles to this property
  return View(objViewModel);
}

使视图成为强类型视图

@model RegisterViewModel
@using (Html.BeginForm())
{
   @Html.TextBoxFor(m => m.FirstName)
   @Html.DropDownListFor(x => x.SelectedRoleId,new SelectList(Model.Roles , "Value","Text"),   "Select Role")
  <input type="submit" value="Save" />
}

并在 HttpPostAction 中,接收此 ViewModel 对象作为参数

[HttpPost]
public ActionResult Register(RegisterViewModel objVM)
{
  if(ModelState.IsValid)
  {
    //Check your custom validation also
    if (createStatus == MembershipCreateStatus.Success)
    {
          //Save and then Redirect
    }
    else
    {
      objVM.Roles=GetAllRolesAs(); // get the list of roles here again because HTTP is stateless
    }
  }  
 return View(objVM);
}