2015-04-24 2 views
0

контроллерМодель Empty на HTTP POST

[HttpPost] 
public ActionResult SaveProduct(string id, AddProductViewModel m) 
{ 
    if (ModelState.IsValid) 
    { 
     using (ComparisonDBDataContext CMP = new ComparisonDBDataContext()) 
     { 
      tblProduct prod = (from c in CMP.tblProducts 
           where c.ProductID == Guid.Parse(id) 
           select c).SingleOrDefault(); 
      prod.Name = m.myName; 
      prod.CategoryID = Guid.Parse(m.myCategory); 
      prod.ManufacturerID=Guid.Parse(m.myManufacturer); 
      CMP.SubmitChanges(); 
     } 
     return RedirectToAction("Products"); 
    } 
    else 
    { 
     m.ProductID = Guid.Parse(id); 
     return View("EditProduct", m); 
    } 
} 

Просмотр

@model Comparison.Models.AddProductViewModel 
@{ 
    ViewBag.Title = "EditProduct"; 
    Layout = "~/Views/_LayoutData.cshtml"; 
} 

<style> 
    .field-validation-error { 
     color: Black; 
    } 
    .validation-summary-errors { 
     font-weight: bold; 
     color: Black; 
    } 
</style> 
<h2>Edit Product</h2> 
@using (Html.BeginForm("SaveProduct", "Home", new { id = @Model.ProductID }, FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 
    <div class="form-horizontal"> 
     <hr /> 
     @Html.ValidationSummary(true) 
     <div class="form-group"> 
      <label class="control-label col-md-2" id="lblName">Name</label> 
      <div class="col-md-5"> 
       @Html.TextBoxFor(m => m.myName, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(m => m.myName) 
      </div> 
     </div> 
     <div class="form-group"> 
      <label class="control-label col-md-2" id="lblCategory">Category</label> 
      <div class="col-md-5"> 
       @Html.DropDownListFor(m => m.myCategory, Model.Category, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(m => m.myCategory) 
      </div> 
     </div> 
     <div class="form-group"> 
      <label class="control-label col-md-2" id="lblManufucturer">Manufucturer</label> 
      <div class="col-md-5"> 
       @Html.DropDownListFor(m => m.myManufacturer, Model.Manufacturer, new {@class="form-control" }) 
       @Html.ValidationMessageFor(m => m.myManufacturer) 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-primary" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Products") 
</div> 

вид Модель

public Guid? myUserID; 

     [Required(ErrorMessage="Required")] 
     public string myCategory; 
     public List<SelectListItem> category = new List<SelectListItem>(); 
     public List<SelectListItem> Category 
     { 
      get 
      { 

       category.Clear(); 
       using (ComparisonDBDataContext CMP = new ComparisonDBDataContext()) 
       { 
        var cat = from g in CMP.tblCategories 
           select new { g.Name, g.CategoryID }; 
        foreach (var q in cat) 
        { 
         category.Add(new SelectListItem() { Text = q.Name, Value = q.CategoryID.ToString() }); 
        } 
        return category; 
       } 
      } 
     } 
     public Guid? ProductID; 

     [Required(ErrorMessage = "Required")] 
     public string myManufacturer; 
     public List<SelectListItem> manufacturer = new List<SelectListItem>(); 
     public List<SelectListItem> Manufacturer 
     { 
      get 
      { 

       category.Clear(); 
       using (ComparisonDBDataContext CMP = new ComparisonDBDataContext()) 
       { 
        var manu = from g in CMP.tblManufacturers 
           select new { g.Name, g.ManufacturerID }; 
        foreach (var q in manu) 
        { 
         manufacturer.Add(new SelectListItem() { Text = q.Name, Value = q.ManufacturerID.ToString() }); 
        } 
        return manufacturer; 
       } 
      } 
     } 

     [Required(ErrorMessage = "Required")] 
     [StringLength(100, ErrorMessage = "Maximum lenght can be 100")] 
     public string myName; 

     public DateTime? CreationDate; 

Я попытался это, но прибегая к помощи не смогли найти какие-либо решения.

Я знаю, что подобные вопросы уже заданы, но я не мог найти решение в них. Так любезно просто просмотрите мой код и скажите мне, что я делаю неправильно. Почему моя модель пуста? На POSTBACK?

+1

Можете ли вы предоставить viewmodel также? – tutok

+0

Попробуйте удалить атрибут HTML из 'BeginForm' и возьмите' HiddenFieldFor' для своего поля ProductID. –

+0

Является ли 'm' null или только свойствами модели? –

ответ

4

Ваше мнение модель содержит свойства с только добытчиками (а в некоторых случаях они просто поля без каких-либо геттер или сеттера), поэтому DefaultModelBinder не может установить их значения. Это должно быть

public string myName { get; set; } 

Сторона примечания: Модель просмотра не должна содержать код доступа к базе данных. Это должно быть просто

public List<SelectListItem> manufacturer { get; set; } 

и диспетчер должен нести ответственность за присвоение коллекции этому имуществу.