2011-09-22 68 views
11

Tôi đang gặp sự cố khi mỗi lần tôi đăng biểu mẫu trở lại phiên bản [HttpPost] của hành động điều khiển của tôi, ModelBinder trả về một đối tượng null. Tôi không thể giải thích tại sao. Nếu tôi thay đổi chữ ký để sử dụng FormCollection thay vào đó tôi có thể thấy rằng tất cả các phím chính xác đã được đặt. Ai đó có thể giúp tôi pin điểm những gì sai ở đây, bởi vì tôi không thể phát hiện ra nó.ASP.NET MVC Model Binder trả về đối tượng null

Dưới đây là các mô hình để làm việc với quan điểm của tôi

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

nào tôi sử dụng trong điều khiển của tôi như vậy:

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

Và nhìn trông như thế này:

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

Trả lời

29

Vấn đề là có xung đột tên giữa thuộc tính có tên là Model trong lớp học DeviceModel và biến có tên model trong hành động Create. Tên va chạm làm cho DefaultModelBinder thất bại, vì nó cố gắng liên kết thuộc tính Mô hình với lớp DeviceModel.

Thay đổi tên của biến trong tác vụ Tạo thành deviceModel và nó sẽ ràng buộc chính xác.

+0

Cảm ơn bạn! Nhưng tại sao mô hình tên làm việc cho một bộ điều khiển khác mà tôi có chấp nhận dữ liệu HttpPost? – Chris

+0

Mô hình cho hành động đó cũng có thuộc tính có tên là Mô hình không? Lý do nó thất bại ở đây là do va chạm tên. – counsellorben

+0

OH xin lỗi tôi thực sự hiểu lầm những gì bạn đã nói trước nhưng tôi rõ ràng bây giờ. Cảm ơn bạn đã giúp đỡ. – Chris

Các vấn đề liên quan