如果未选中 CheckBox,则填充 DropDownList

Populate DropDownList if CheckBox not checked

如果用户尝试在没有 selectCheckBox 的情况下提交表单,则在填充我的 DropDownList 时遇到问题。

如果用户填写了所有必填字段但未select复选框,然后单击提交,DropDownList 中的值将被删除。如果用户最初没有 select CheckBox,我不确定是否或如何再次填充这些值。

下面的 RenterViewModel:

public class RenterViewModel
{
    [Required(ErrorMessage = "First Name is required")]
    [Display(Name = "First Name")]
    [StringLength(25)]
    [MaxLength(25)]
    public string RenterFirstName { get; set; }

    [Required(ErrorMessage = "Last Name is required")]
    [Display(Name = "Last Name")]
    [StringLength(25)]
    [MaxLength(25)]
    public string RenterLastName { get; set; }

    [Required(ErrorMessage = "Address is required")]
    [Display(Name = "Address")]
    [StringLength(50)]
    [MaxLength(50)]
    public string RenterAddress { get; set; }

    [Required(ErrorMessage = "City is required")]
    [Display(Name = "City")]
    [StringLength(35)]
    [MaxLength(35)]
    public string RenterCity { get; set; }

    [Required(ErrorMessage = "Zip Code is required")]
    [Display(Name = "Zip Code")]
    [StringLength(5, MinimumLength = 5, ErrorMessage = "Zip Code should have minimum 5 digits")]
    [MaxLength(5)]
    [RegularExpression("([1-9][0-9]*)", ErrorMessage = "Numeric values only")]
    public string RenterZipCode { get; set; }

    [Required(ErrorMessage = "Phone Number is required")]
    [Display(Name = "Phone Number")]
    [DataType(DataType.PhoneNumber)]
    [RegularExpression(@"^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$", ErrorMessage = "Not a valid Phone number")]
    public string RenterPhoneNumber { get; set; }

    [Required(ErrorMessage = "Email Address is required")]
    [Display(Name = "Email Address")]
    [DataType(DataType.EmailAddress)]
    [MaxLength(255)]
    [RegularExpression(@"[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}", ErrorMessage = "Incorrect Email Format")]
    public string RenterEmailAddress { get; set; }

    [Required(ErrorMessage = "Date of Birth is required")]
    [Display(Name = "Date of Birth")]
    [DataType(DataType.Date)]
    public DateTime RenterDateOfBirth { get; set; }

    [Required(ErrorMessage = "Name of Employer is required")]
    [Display(Name = "Name of Employer")]
    [StringLength(50)]
    [MaxLength(50)]
    public string RenterEmployerName { get; set; }

    [Required(ErrorMessage = "Employer Phone Number is required")]
    [Display(Name = "Employer Phone Number")]
    [DataType(DataType.PhoneNumber)]
    [RegularExpression(@"^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$", ErrorMessage = "Not a valid Phone number")]
    public string RenterEmployerPhoneNumber { get; set; }

    [Required(ErrorMessage = "Length of Employment is required")]
    [Display(Name = "Length of Employment")]
    [MaxLength(50)]
    public string RenterEmploymentLength { get; set; }

    [Required(ErrorMessage = "Monthly Gross Income is required")]
    [Display(Name = "Monthly Gross Income")]
    [Range(1, 100000000), DataType(DataType.Currency)]
    public decimal RenterEmploymentGrossIncome { get; set; }

    [Required(ErrorMessage = "Total number of persons to occupy apartment is required")]
    [Display(Name = "Total number of persons to occupy apartment")]
    [Range(1, 10, ErrorMessage = "Must be between 1 to 10")]
    public int RenterTotalPersonsOccupy { get; set; }

    [Required(ErrorMessage = "Total number of children to occupy apartment is required")]
    [Display(Name = "Total number of Children to occupy apartment")]
    [Range(0, 10, ErrorMessage = "Must be between 0 to 10")]
    public int RenterTotalChildrenOccupy { get; set; }

    //[Required(ErrorMessage = "You must exept terms to continue")]
    [Display(Name = "I agree to the Terms")]
    [Range(typeof(bool), "true", "true", ErrorMessage = "You must accept the Terms")]
    //[Controllers.RenterController.CheckBoxRequired(ErrorMessage = "Please checked the items")]
    public bool RenterAllowTerms { get; set; }

    [Required(ErrorMessage = "Please select State")]
    [Display(Name = "State")]
    public int StateId { get; set; }
    public IEnumerable<SelectListItem> States { get; set; }
} code here

下面的RenterController:

public class RenterController : Controller
{
    private readonly ApplicationDbContext _db;
    public RenterController(ApplicationDbContext db)
    {
        _db = db;
    }

    // GET: /Renters List/
    public IActionResult Index()
    {
        IEnumerable<Renter> objList = _db.Renters;
        return View(objList);
    }

    // GET: /Create
    public IActionResult Create()
    {
        RenterViewModel rentervm = new RenterViewModel()
        {
            States = _db.States.Select(i => new SelectListItem
            {
                Text = i.StateInitial,
                Value = i.StateId.ToString()
            })
        };

        return View(rentervm);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(RenterViewModel rentervm)
    {
        if (ModelState.IsValid)
        {
            var renterobj = new Renter();
            {
                renterobj.RenterFirstName = rentervm.RenterFirstName;
                renterobj.RenterLastName = rentervm.RenterLastName;
                renterobj.RenterAddress = rentervm.RenterAddress;
                renterobj.RenterCity = rentervm.RenterCity;
                renterobj.StateId = rentervm.StateId;
                renterobj.RenterZipCode = rentervm.RenterZipCode;
                renterobj.RenterPhoneNumber = rentervm.RenterPhoneNumber;
                renterobj.RenterEmailAddress = rentervm.RenterEmailAddress;
                renterobj.RenterDateOfBirth = rentervm.RenterDateOfBirth;
                renterobj.RenterEmployerName = rentervm.RenterEmployerName;
                renterobj.RenterEmployerPhoneNumber = rentervm.RenterEmployerPhoneNumber;
                renterobj.RenterEmploymentLength = rentervm.RenterEmploymentLength;
                renterobj.RenterEmploymentGrossIncome = rentervm.RenterEmploymentGrossIncome;
                renterobj.RenterTotalPersonsOccupy = rentervm.RenterTotalPersonsOccupy;
                renterobj.RenterTotalChildrenOccupy = rentervm.RenterTotalChildrenOccupy;
                renterobj.RenterAllowTerms = rentervm.RenterAllowTerms;
            }

            _db.Renters.Add(renterobj);
            await _db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        return View(rentervm);
    }

创建视图:

<form method="post" asp-action="Create">
<div class="border p-3">
    <div class="form-group row">
        <h2 class="text-black-50 pl-3">Preliminary Rental Application</h2>
    </div>
    <div class="row">
        <div class="col-12">
            <div class="form-group row">
                <div class="col-4">
                    <label asp-for="RenterFirstName"></label>
                    <input asp-for="RenterFirstName" class="form-control" />
                    <span asp-validation-for="RenterFirstName" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterLastName"></label>
                    <input asp-for="RenterLastName" class="form-control" />
                    <span asp-validation-for="RenterLastName" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterAddress"></label>
                    <input asp-for="RenterAddress" class="form-control" />
                    <span asp-validation-for="RenterAddress" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterCity"></label>
                    <input asp-for="RenterCity" class="form-control" />
                    <span asp-validation-for="RenterCity" class="text-danger"></span>
                </div>

                <div class="col-4">
                    <label asp-for="StateId"></label>
                    <select asp-for="StateId" asp-items="@Model.States" class="form-control">
                        <option></option>
                    </select>
                    <span asp-validation-for="StateId" class="text-danger"></span>
                </div>

                <div class="col-4">
                    <label asp-for="RenterZipCode"></label>
                    <input asp-for="RenterZipCode" class="form-control" />
                    <span asp-validation-for="RenterZipCode" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterPhoneNumber"></label>
                    <input asp-for="RenterPhoneNumber" type="tel" class="form-control" />
                    <span asp-validation-for="RenterPhoneNumber" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterEmailAddress"></label>
                    <input asp-for="RenterEmailAddress" type="email" class="form-control" />
                    <span asp-validation-for="RenterEmailAddress" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterDateOfBirth"></label>
                    <input asp-for="RenterDateOfBirth" type="date" class="form-control" />
                    <span asp-validation-for="RenterDateOfBirth" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterEmployerName"></label>
                    <input asp-for="RenterEmployerName" class="form-control" />
                    <span asp-validation-for="RenterEmployerName" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterEmployerPhoneNumber"></label>
                    <input asp-for="RenterEmployerPhoneNumber" type="tel" class="form-control" />
                    <span asp-validation-for="RenterEmployerPhoneNumber" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterEmploymentLength"></label>
                    <input asp-for="RenterEmploymentLength" type="tel" class="form-control" />
                    <span asp-validation-for="RenterEmploymentLength" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterEmploymentGrossIncome"></label>
                    <input asp-for="RenterEmploymentGrossIncome" class="form-control" />
                    <span asp-validation-for="RenterEmploymentGrossIncome" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterTotalPersonsOccupy"></label>
                    <input asp-for="RenterTotalPersonsOccupy" class="form-control" />
                    <span asp-validation-for="RenterTotalPersonsOccupy" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterTotalChildrenOccupy"></label>
                    <input asp-for="RenterTotalChildrenOccupy" class="form-control" />
                    <span asp-validation-for="RenterTotalChildrenOccupy" class="text-danger"></span>
                </div>
                <div class="col-4">
                    <label asp-for="RenterAllowTerms"></label>
                    <input asp-for="RenterAllowTerms">
                    <span asp-validation-for="RenterAllowTerms" class="text-danger"></span>
                </div>
            </div>

            <div class="form-group row">
                <div class="col-8 offset-2 row">
                    <div class="col">
                        <input type="submit" class="btn btn-info w-75" value="create" />
                    </div>
                    <div class="col">
                        <a asp-action="Index" class="btn btn-danger w-75">Back</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

假设您的 ModelState.IsValid 是 returning false(因为您要求用户在提交前选中该复选框)并且由于某种原因您丢失了 States 字段中的数据,您应该re-populate 状态 select 列表项,在您 return 您的视图之前。

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(RenterViewModel rentervm)
    {
        if (ModelState.IsValid)
        {
            var renterobj = new Renter();
            {
                renterobj.RenterFirstName = rentervm.RenterFirstName;
                renterobj.RenterLastName = rentervm.RenterLastName;
                renterobj.RenterAddress = rentervm.RenterAddress;
                renterobj.RenterCity = rentervm.RenterCity;
                renterobj.StateId = rentervm.StateId;
                renterobj.RenterZipCode = rentervm.RenterZipCode;
                renterobj.RenterPhoneNumber = rentervm.RenterPhoneNumber;
                renterobj.RenterEmailAddress = rentervm.RenterEmailAddress;
                renterobj.RenterDateOfBirth = rentervm.RenterDateOfBirth;
                renterobj.RenterEmployerName = rentervm.RenterEmployerName;
                renterobj.RenterEmployerPhoneNumber = rentervm.RenterEmployerPhoneNumber;
                renterobj.RenterEmploymentLength = rentervm.RenterEmploymentLength;
                renterobj.RenterEmploymentGrossIncome = rentervm.RenterEmploymentGrossIncome;
                renterobj.RenterTotalPersonsOccupy = rentervm.RenterTotalPersonsOccupy;
                renterobj.RenterTotalChildrenOccupy = rentervm.RenterTotalChildrenOccupy;
                renterobj.RenterAllowTerms = rentervm.RenterAllowTerms;
            }

            _db.Renters.Add(renterobj);
            await _db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        //you should re populate the States field here before returning the view
        return View(rentervm);
    }