2015-04-09 5 views
-1

Я знаю, что этот вопрос задавали и отвечали дюжину раз, но ни одно из решений не помогло мне.POST action pass null ViewModel

У меня есть следующая ViewModel, которая состоит из модели данных ProductDetail и списка модели данных Product_ProductCategoryAttribute.

public class ProductDetailViewModel 
{ 
    public ProductDetail ProductDetail { get; set; } 
    public List<Product_ProductCategoryAttribute> Product_ProductCategoryAttribute { get; set; } 
} 

На обратной стороне действия я получаю пустой ViewModel.

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit([Bind(Include = "idProductDetail,idProductCategory,idProduct,Name,Description")] ProductDetailViewModel productDetailAll) 
    { 
     if (ModelState.IsValid) 
     { 
      ProductDetail productDetail = productDetailAll.ProductDetail; 
      db.Entry(productDetail).State = EntityState.Modified; 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     return View(productDetailAll); 
    } 

Однако, поскольку я считаю, что основная проблема находится где-то в пределах представления, я добавлю фрагмент кода представления.

@using (Html.BeginForm("Edit", "ProductDetail", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     @Html.HiddenFor(model => model.ProductDetail.idProductDetail) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.ProductDetail.Name, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.TextBoxFor(model => model.ProductDetail.Name, new { htmlAttributes = new { @class = "form-control" } }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.ProductDetail.Description, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.TextBoxFor(model => model.ProductDetail.Description, new { htmlAttributes = new { @class = "form-control" } }) 
      </div> 
     </div> 

     @for (int i = 0; i < Model.Product_ProductCategoryAttribute.Count(); i++) 
     { 
      <div class="form-group"> 
       <label class="control-label col-md-2">@Model.Product_ProductCategoryAttribute[i].ProductCategoryAttribute.Name</label> 
       <div class="col-md-5"> 
        @Html.TextBoxFor(model => model.Product_ProductCategoryAttribute[i].Value, new { @class = "form-control" }) 
       </div> 
      </div> 
     } 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-sm btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

HTML генерируется из вида сверху выглядит следующим образом (некоторые части опущены для краткости):

<form action="/Administration/ProductDetail/Edit/4" method="post"><input name="__RequestVerificationToken" type="hidden" value="IS4fstTTjOD4d9FEzyM5yWlvO9xqlOq_AHFx_8_vC079F1iDvucf5wgRIgV4iXH-NGU-u-J8IHBiKT4ApvR3cSLbhw_AntbibEFsD68eUkc1" /> 
     <input data-val="true" data-val-number="The field idProductDetail must be a number." data-val-required="The idProductDetail field is required." id="ProductDetail_idProductDetail" name="ProductDetail.idProductDetail" type="hidden" value="4" /> 

     <div class="form-group"> 
      <label class="control-label col-md-2" for="ProductDetail_Name">Name</label> 
      <div class="col-md-10"> 
       <input htmlAttributes="{ class = form-control }" id="ProductDetail_Name" name="ProductDetail.Name" type="text" value="Čipka i hiljadu šara" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      <label class="control-label col-md-2" for="ProductDetail_Description">Description</label> 
      <div class="col-md-10"> 
       <input htmlAttributes="{ class = form-control }" id="ProductDetail_Description" name="ProductDetail.Description" type="text" value="Šipka i čipka" /> 
      </div> 
     </div> 

      <div class="form-group"> 
       <label class="control-label col-md-2">Veličina</label> 
       <div class="col-md-5"> 
        <input class="form-control" id="Product_ProductCategoryAttribute_0__Value" name="Product_ProductCategoryAttribute[0].Value" type="text" value="" /> 
       </div> 

      </div> 
      <div class="form-group"> 
       <label class="control-label col-md-2">Širina</label> 
       <div class="col-md-5"> 
        <input class="form-control" id="Product_ProductCategoryAttribute_1__Value" name="Product_ProductCategoryAttribute[1].Value" type="text" value="" /> 
       </div> 

      </div> 
      <div class="form-group"> 
       <label class="control-label col-md-2">Pakiranje</label> 
       <div class="col-md-5"> 
        <input class="form-control" id="Product_ProductCategoryAttribute_2__Value" name="Product_ProductCategoryAttribute[2].Value" type="text" value="" /> 
       </div> 

      </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Save" class="btn btn-sm btn-default" /> 
      </div> 
     </div> 
    </div> 

Я не уверен, что если что-то не так с именованием, но моя ставка была бы на этом.

+0

Какой метод вы отправляете обратно? –

+0

@StephenMuecke Это действительно базовый - он ничего не делает (пока), но принимает ** ProductDetailViewModel ** –

+0

Покажите это. Элементы управления названы правильно, поэтому ошибка в вашем методе контроллера. Может быть несколько причин, но лучше всего предположить, что вы назвали параметр тем же именем, что и одно из ваших свойств модели. –

ответ

0

Проблема была в автогенерированном контроллере. Редактирование действия, которое добавило пару [Bind (Include = "")] Неправильные атрибуты и которые препятствовали публикации данных на сервере.

Правильный фрагмент кода будет выглядеть следующим образом:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit (ProductDetailViewModel productDetailAll) 
{ 
    if (ModelState.IsValid) 
    { 
     ProductDetail productDetail = productDetailAll.ProductDetail; 
     db.Entry(productDetail).State = EntityState.Modified; 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    return View(productDetailAll); 
} 
Смежные вопросы