2011-09-22 19 views
11

Sto riscontrando un problema in cui ogni volta che si invia un modulo alla versione [HttpPost] dell'azione del mio controller, ModelBinder restituisce un oggetto nullo. Non riesco a capire perché. Se cambio la firma per usare un FormCollection invece posso vedere che tutte le chiavi corrette sono state impostate. Qualcuno può aiutarmi a individuare ciò che non va qui, perché non riesco a individuarlo.ASP.NET MVC Model Binder restituisce oggetto nullo

Qui ci sono i modelli per lavorare con i miei punti di vista

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; } 
} 

che uso nel mio controller in questo modo:

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(); 
} 

e la vista si presenta così:

@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> } 

risposta

29

Il problema è che esiste una collisione di nome tra la proprietà denominata Model nella classe DeviceModel e la variabile denominata model nell'azione Create. La collisione del nome causa il fallimento di DefaultModelBinder, poiché tenta di associare la proprietà Model alla classe DeviceModel.

Modificare il nome della variabile nell'azione Crea su deviceModel e si collegherà correttamente.

+0

Ha funzionato grazie! Ma perché il modello name funziona per un altro controller che ho che accetta i dati HttpPost? – Chris

+0

Il modello per quell'azione ha anche una proprietà denominata Modello? La ragione per cui stava fallendo qui era a causa della collisione di nome. – counsellorben

+0

OH scusa ho davvero frainteso quello che stavi dicendo prima ma ora sono chiaro. Grazie per il tuo aiuto. – Chris

Problemi correlati