【问题标题】:ViewModel in post action is null后期操作中的 ViewModel 为空
【发布时间】:2020-05-17 19:59:29
【问题描述】:

有人可以帮我知道为什么model.Prod 如下图所示为空,而model.catg 不为空吗?我的产品表中有项目。而且在我将@Html.HiddenFor(p=>p.Prod[i].id) 添加到视图之后,model.Prod 不为空,但只有id 具有价值。其他参数仍然为空。

@model HandMShop.ViewModel.HMViewM

@using (Html.BeginForm("ShopPage", "Shop", FormMethod.Post)) {

@for(int i=0;i< Model.catg.Count;i++)  {
@Html.CheckBoxFor(model => model.catg[i].IsChecked)
<label>@Model.catg[i].CategoryName</label>
 @Html.HiddenFor(model => model.catg[i].id)
 @Html.HiddenFor(model => model.catg[i].CategoryName }

 @for (int i = 0; i < Model.Prod.Count; i++) {
 <div class="col-md-6 col-lg-4">
 <figure class="card card-product mehsul">
 <div class="img-wrap"> <img class="img-fluid mehsulimg" 
 src="@Model.Prod[i].PhotoProducts.First().ImageName" alt=""> </div>
 <div class="handhover">
 <img class="img-fluid" src="@Model.Prod[i].PhotoProducts.Last().ImageName" alt=""> 
 </div>
 <figcaption class="info-wrap">
 <h4 class="title">@Model.Prod[i].ProdName</h4>
 <p class="desc">@Model.Prod[i].Description</p>
 </figcaption>
 </figure>
  </div> 
      }

查看我使用的模型:

public class HMViewM
{
    public List<User> userr { get; set; }
    public List<homesec1slider> homesec1 { get; set; }
    public List<Category>  catg { get;set; }
    public List<Colour> colrs { get; set; }
    public List<PhotoProduct> Photopr { get; set; }
    public List<Product> Prod { get; set; }
    public bool Istehsal { get; set; }
}

控制器

  [HttpPost]
    public ActionResult ShopPage(HMViewM model)
    {
        List<Category> selectedcatg = model.catg.Where(x => x.IsChecked == true).ToList();
        List<Product> selectedprod = model.Prod.Where(i => i.CategoryId == selectedcatg.FirstOrDefault().id).ToList();
        var vm = new HMViewM
        {
            Prod = selectedprod,
            catg = _context.Categories.ToList(),
            colrs = _context.Colours.ToList(),
            Photopr = _context.PhotoProducts.Where(ph => ph.Product.id == ph.ImageId).ToList(),
        };
        return View(vm);
    }

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework


    【解决方案1】:

    这是因为在通过单击提交按钮回发页面后,只有那些属性将返回到您的控制器,您明确地将它们绑定到 html input 元素。 您的代码中绑定的值是:

    @Html.CheckBoxFor(model => model.catg[i].IsChecked)
    
    @Html.HiddenFor(model => model.catg[i].id)
    @Html.HiddenFor(model => model.catg[i].CategoryName }
    

    所以只有这些值填写在您的控制器 HMViewM 对象中。 如果您想要其他值,您也应该将它们绑定到 html 输入元素(使用隐藏字段、文本、复选框...)

    【讨论】:

    • 感谢您的回答。我有很多属性。我应该手动编写所有这些还是有其他方法?
    • @Aytac:别无他法。一般来说,在view 中绑定您不想更改的属性并不是一个好主意,因为它对页面的请求时间有负面影响,相反,最好只绑定它们的 Id 并获取它们的其他道具服务器端
    • 我明白了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多