簡體   English   中英

MVC 4/5添加靜態下拉列表以向驗證注冊

[英]MVC 4/5 Add static dropdown to register with validation

在注冊頁面上,我為vdab學生添加了一個下拉列表:是/否但是viewmodel中描述的驗證無效 (我想這是因為我使用ViewBag而不是模型嗎?)

有人可以幫我創建下拉菜單,這樣我可以使用以下方式:

@Html.DropDownFor(x => x.Something, Model.Something, "Select a component type" )

這就是我所擁有的:

身份模型

public class ApplicationUser : IdentityUser
{

    public virtual Person Person { get; set; }

}

public class Person
{
    public virtual Klas Klas { get; set; }
    public int Id { get; set; }
    public string Voornaam { get; set; }
    public string Familienaam { get; set; }
    public bool Vdab { get; set; }
}
public class Klas
{
    public int Id { get; set; }
    public string Omschrijving { get; set; }

}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("ConnectionString")
    {
    }
}

RegisterViewModel:

public class RegisterViewModel
{
    [Required]
    [Display(Name = "Gebruikersnaam")]
    public string UserName { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "Het {0} moet misntens {2} Karakters lang zijn.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Wachtwoord")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Bevestig Wachtwoord")]
    [Compare("Password", ErrorMessage = "De wachtwoorden komen niet overeen")]
    public string ConfirmPassword { get; set; }

    [Required]
    [Display(Name = "Voornaam")]
    public string Voornaam { get; set; }

    [Required]
    [Display(Name = "Familienaam")]
    public string Familienaam { get; set; }

    [Required]
    [Display(Name = "Klas")]
    public string Klas { get; set; }

    [Required]      
    [Display(Name = "Vdab Student")]
    public bool Vdab { get; set; }

}

並在AcountController中:

      [AllowAnonymous]
    public ActionResult Register()
    {
        var Vdab = new SelectList(new[] { new { ID = "1", Name = "Ja" }, new { ID = "0", Name = "Nee" }, }, "ID", "Name", 1);
        ViewBag.Vdab = Vdab;
        return View();
    }

最后,我用剃刀在視圖中顯示下拉菜單

     <div class="form-group">
             @Html.LabelFor(m => m.Vdab, new { @class = "col-md-2 control-label" })
             <div class="col-md-10">

                 @Html.DropDownList("Vdab", @ViewBag.Vdab as SelectList, "----Maak een keuze ----")
             </div>
         </div>

您可以使用:

 @Html.DropDownList("Vdab", @ViewBag.Vdab as SelectList, "----Maak een keuze ----")

只要在您的控制器中,您就可以這樣做:

   [AllowAnonymous]
public ActionResult Register()
{
   List<SelectListItem> myList =new List<SelectListItem>();
   myList.Add(new SelectListItem { Value = bool.TrueString, Text = "Ja" });
   myList.Add(new SelectListItem { Value = bool.FalseString, Text = "Nee" });

    var Vdab = new SelectList(myList,"Value","Text");

    ViewBag.Vdab = Vdab;
    return View();
}

將此添加到您的RegisterViewModelClass:

public IEnumerable<SelectListItem> VdabSelectList { get; set; }

並在控制器中:

[AllowAnonymous]
public ActionResult Register()
{
    RegisterViewModel viewModel = new RegisterViewModel();
    viewModel.VdabSelectList = new[]
        {
            new SelectListItem { Value = bool.TrueString, Text = "Ja" },
            new SelectListItem { Value = bool.FalseString, Text = "Nee" }
        }
    return View(viewModel);
}

[HttpPost]
public ActionResult Register(RegisterViewModel _viewModel)
{
    //Do stuff with form data...
}

最后,將此添加到您的視圖:

 <div class="form-group">
     @Html.LabelFor(m => m.Vdab, new { @class = "col-md-2 control-label" })
     <div class="col-md-10">
         @Html.DropDownListFor(m => m.vDab, new SelectList(m.VdabSelectList, "Value", "Text"))
     </div>
 </div>

免責聲明:我還沒有嘗試使用帶有布爾值的DropDownListFor,但是根據這篇文章 ,它似乎應該可以工作。 我總是將單選按鈕用於布爾值,如下所示:

@Html.RadioButtonFor(m => m.Vdab, true)Ja
@Html.RadioButtonFor(m => m.Vdab, false)Nee

您的問題很簡單,您已指定模型類型為bool。 布爾是一種值類型,並且始終會包含一個值,因此無論如何驗證都不會失敗。 它始終至少包含默認值false。

您想使類型為可空。

[Required]      
[Display(Name = "Vdab Student")]
public bool? Vdab { get; set; }

現在,您所需的驗證將正常工作,並且原始(且正確)的HTML幫助程序也將工作。

@Html.DropDownFor(x => x.Something, Model.SomethingList, "Select a component type" )

但是,請注意。將您的列表更改為Model.SomethigList,對您的Selected項和列表使用相同的名稱可能會導致很多問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM