2011-09-22 12 views
11

Bir denetleyici eylemimin [HttpPost] sürümüne geri her gönderdiğimde, ModelBinder bir null nesnesi döndürdüğü bir sorun yaşıyorum. Nedenini çözemiyorum. İmzayı bir FormCollection kullanacak şekilde değiştirirsem bunun yerine tüm doğru anahtarların ayarlandığını görebiliyorum. Birisi bana burada neyin yanlış olduğunu göstermeme yardım edebilir, çünkü ben onu göremiyorum. İşte ASP.NET MVC Model Binder, null nesnesini döndürür

benim görünümleri

public class DeviceModel 
{ 
    public int Id { get; set; } 

    [Required] 
    [Display(Name = "Manufacturer")] 
    public int ManufacturerId { get; set; } 

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

    [StringLength(50)] 
    [Display(Name = "Name")] 
    public string Name { get; set; } 

    [StringLength(50)] 
    [Display(Name = "CodeName")] 
    public string CodeName { get; set; } 

    public int? ImageId { get; set; } 
} 

public class DeviceCreateViewModel : DeviceModel 
{ 
    public IEnumerable<SelectListItem> Manufacturers { get; set; } 
} 
ben şöyle benim denetleyicisi kullanmak

ile çalışmak için modeller şunlardır:

public ActionResult Create() 
{ 
    DeviceCreateViewModel viewModel = new DeviceCreateViewModel() 
              { 
               Manufacturers = ManufacturerHelper.GetSortedManufacturersDropDownList() 
              }; 

    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Create(DeviceModel model) 
{ 
    // if I check model here it is NULL 
    return View(); 
} 

Ve görünümü şuna benzer:

@model TMDM.Models.DeviceCreateViewModel 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ManufacturerId) 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("ManufacturerId", Model.Manufacturers) 
      @Html.ValidationMessageFor(model => model.ManufacturerId) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Model) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Model) 
      @Html.ValidationMessageFor(model => model.Model) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.CodeName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.CodeName) 
      @Html.ValidationMessageFor(model => model.CodeName) 
     </div> 

     <p> 
      <input type="submit" value="Save" class="medium green awesome" /> 
      @Html.ActionLink("Cancel", "Index", "Device", null, new { @class="medium black awesome" }) 
     </p> 
    </fieldset> } 

cevap

29

Sorun, sınıfta Model isimli özellik arasında bir isim çarpışması olmasıdır. DeviceModel ve adlı Create eylemindeki değişken. Model çarpanı DeviceModel sınıfına bağlanmaya çalıştığı için isim çarpışması DefaultModelBinder başarısız olmasına neden olur.

Oluştur eyleminde, değişkenin adını deviceModel olarak değiştirin ve doğru şekilde bağlanacaktır.

+0

Bu işe yaradı! Ama isim modeli neden HttpPost verilerini kabul eden başka bir denetleyici için çalışıyor? – Chris

+0

Bu eylem için modelin Model adında bir özelliği var mı? Burada başarısız olmasının sebebi isim çarpışmasıydı. – counsellorben

+0

OH Üzgünüm, daha önce söylediklerimi yanlış anladım ama şimdi berrakım. Yardımınız için teşekkürler. – Chris

İlgili konular