2013-08-21 13 views
5

ASP.NET MVC4 ile çalışıyorum ve şimdi mysql veritabanımdaki verileri içeren bir açılır liste eklemek istiyorum.Değer boş olamaz. Parametre adı: items (DrodownList)

benim görünümü (Register.cshtml) in: Bu benim yaptığım `benim Kontrolör (AccountController) olarak

<div class="control-group"> 
    @Html.LabelFor(m => m.DistrictID, new { @class= "control-label"}) 
    <div class="controls"> 
     @Html.DropDownListFor(model => model.DistrictID, new SelectList(ViewBag.Districts, "district_id", "district_name", Model.DistrictID)) 
    </div> 
</div> 

:

[AllowAnonymous] 
public ActionResult Register() 
{ 
    var districts = repository.GetDistricts(); 
    ViewBag.Districts = districts; 

    return View(new RegisterModel()); 
} 

// 
// POST: /Account/Register 

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult Register(RegisterModel model) 
{ 

    if (ModelState.IsValid) 
    { 
     // Attempt to register the User 
     try 
     { 
      MembershipService.CreateUser(model.Name, model.FamilyName, model.BirthDate, model.Sex, model.Nationality, model.Email, model.UserName, model.Password, model.Street, model.StreetNr); 

      FormsAuthentication.SetAuthCookie(model.UserName, false); 
      return RedirectToAction("Index", "Home"); 
     } 
     catch (ArgumentException ae) 
     { 
      ModelState.AddModelError("", ae.Message); 
     } 
    } 

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

Ben İlçeler aldığım Repository bunu beğendi:

public IQueryable<district> GetDistricts() 
{ 
    return from district in entities.districts 
      orderby district.district_name 
      select district; 
} 

Benim RegisterModel:

public class RegisterModel 
{ 
    [Required] 
    [Display(Name = "Given name")] 
    public string Name { get; set; } 

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

    [Required] 
    [Display(Name = "Birthdate")] 
    public DateTime BirthDate { get; set; } 

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

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

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

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

    [Required] 
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 

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

    [Required] 
    [Display(Name = "Street Number")] 
    public int StreetNr { get; set; } 

    [Required] 
    [Display(Name = "District")] 
    public IEnumerable<SelectListItem> Districts { get; set; } 

    public int DistrictID { get; set; } 
} 

dropdownlist ilçeleri ile dolu ama tıkladığımda bu hatayı alıyorum "Kayıt" dır:

Value cannot be null. Parameter name: items

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentNullException: Value cannot be null. Parameter name: items

Ben yöntemini hata ayıklama ModelState olduğunu görüyoruz Geçerli değil.
Anahtar 11 DistrictID ve districtid kapsar ancak Anahtar 12 İlçeler ve hata veriyor: "The district field is required" ...

yanlış yapıyorum?

+0

Özel durum, yalnızca doğrulama başarısız olduğunda veya doğrulama da geçtiğinde atılır mı? – Andrei

cevap

6

Model doğrulama başarısız olduğunda durumu göz önünde bulundurun. İstek, istekle birlikte gönderilen modelle tekrar görüntülenecektir. Ancak bu satırı:

new SelectList(ViewBag.Districts, "district_id", "district_name", Model.Districts) 

durum neden ViewBag.Districts repopulated değildi çünkü bir ilk parametre olarak null sahip olacaktır. Yani istisna önlemek için sadece yine bu özelliğini ayarlayın:

// If we got this far, something failed, redisplay form 
var districts = repository.GetDistricts(); 
ViewBag.Districts = districts; 
return View(model); 

Güncelleme. Model tanımını gördüğünüzde, hemen akla gelen şey, Districts koleksiyonunun Required özniteliğidir. Muhtemelen bunlardan herhangi birini girmeniz veya veritabanına kaydetmeniz gerekmez. Bu özelliği kaldırmayı deneyin ve bu özellikle ilgili hata ortadan kalkar.

+0

Şimdi "Kayıt Ol" a tıkladığımda, sayfayı yeniden yükler ve değerler hala doldurulur ama hiçbir şey olmuyor ... Ayrıca veritabanına eklediniz – nielsv

+0

@ niels123, hata ayıklamayı denediniz mi? En azından yapabileceğiniz şey, 'AddModelError' için boş bir dize yerine anlamlı bir anahtar kullanmak ve Html.ValidationMessage ile sayfada bir yerde görüntülemek - bu durum istisnanın ortaya çıkması durumunda gösterilir. Ama yine de, neyin yanlış gittiğini anlamanın en iyi yolu sadece yöntemi ayıklamaktır. – Andrei

+0

Yöntemi kontrol ettim ve modeltat geçerli değil. Anahtar 11 (DistrictID) benim bölge kimliğime sahip fakat Anahtar 12 (Bölgeler) bir hata veriyor: "Bölge alanı gerekli". – nielsv