【问题标题】:Can’t update ICollection property无法更新 ICollection 属性
【发布时间】:2017-12-06 16:55:41
【问题描述】:

问题是当我尝试同时更新主表和详细表时。
当调用 Post Edit Task 时,Details 对象不会出现。

编辑视图正确显示所有详细信息行,但在调试编辑 POST 时,Casas 为空

模型

 public partial class Modelo : IValidatableObject {
     public Modelo()    
     {
         Casas = new HashSet<Casa>();
     }

     public int Modeloid { get; set; }
     public string Modelo1 { get; set; }
     public virtual ICollection<Casa> Casas { get; set; }//Don’t work to update
}

public partial class Casa   //  DETAIL TABLE
{
    public int Casaid { get; set; }
    public int Modeloid { get; set; }  // FK to Modelo
    public string Casa1 { get; set; }
    public virtual Modelo Modelo { get; set; }
}

控制器

public class ModelosController : Controller

. . . . . . . . . 
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id,  Modelo modelo)
{
   if (id != modelo.Modeloid)
   {
       return NotFound();
   }
   if (ModelState.IsValid)
   {
   //   Here modelo.Modelo1 has current modified value 
   //   but modelo.Casas.Count == 0
        _context.Update(modelo);  
        await _context.SaveChangesAsync();
   }
}

// GET: Modelos/Edit
public async Task<IActionResult> Edit(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var modelo = await _context.Modelo
                       .AsNoTracking() 
                       .Include(m => m.Fotomodelos)
                       .Include(m => m.Casas)
                       .SingleOrDefaultAsync(m => m.Modeloid == id);
    if (modelo == null)
    {
        return NotFound();
    }
    return View(modelo);
}

查看 EDIT.CSHTML

@using System.IO
@model Disponibilidad.Models.Modelo


<form asp-action="Edit">
  <div class="form-horizontal">
  <hr />
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
      <input type="hidden" asp-for="Modeloid" />
      <div class="form-group">
        <label asp-for="Modelo1" class="col-md-2 control-label"></label>
        <div class="col-md-10">
           <input asp-for="Modelo1" class="form-control" />
           <span asp-validation-for="Modelo1" class="text-danger"></span>
        </div>
      </div>
      @{
       for (int i = 0; i < Model.Casas.Count; i++)
       {
            <input type="hidden" asp-for="@Model.Casas.ElementAt(i).Modeloid"
                             value="@Model.Modeloid" />
            <input type="hidden" asp-for="@Model.Casas.ElementAt(i).Casaid" />
        <div class="form-group">
         <label asp-for="@Model.Casas.ElementAt(i).Casa1" 
            class="col-md-2 control-label"></label>
         <div class="col-md-10">
            <input asp-for="@Model.Casas.ElementAt(i).Casa1"      
               class="form-control" />    <!--  DISPLAY OK Detail rows -->  
            <span asp-validation-for="@Model.Casas.ElementAt(i).Casa1" 
              class="text-danger"></span>
         </div>
        </div>
       }
       }

       <div class="btn-group">
         <button type="submit" class="btn btn-danger">Save</button>
       </div>
    </div>
</form>

【问题讨论】:

  • 您是否尝试将问题隔离到最小的可重现单元?我的意思是,如果您的假设是 ICollection 的行为不符合您的预期(大概是在阅读文档之后),那么您应该隔离这部分逻辑,以便您可以在没有所有多余代码的情况下提出问题(使更容易帮助你)。如果您执行上述操作并发现实际上 ICollection 确实在您的情况下表现得如此,那么您可以将其从问题列表中划掉,也许这表明来自客户端的 MVC 绑定回有问题?
  • 是的,我愿意。谢谢你的建议。
  • 当我在调试 Edit Post 时,属性“Collection.count of Detail object”= 0 (cero) Master Table IS class Modelo Detail Table IS class Casa 我正在使用 VisualStudio 2017,EF核心和 MVC 模式在此先感谢
  • 检查它是如何被渲染到输出的。要发生绑定,输入的名称应类似于modelo.propName。我敢打赌,您必须手动更改 Razor 并添加名称和值属性,而不是使用 asp-for taghelper。

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


【解决方案1】:

当您在 Razor 中使用 for 循环而不是 foreach 时,使用默认的 asp-for TagHelpers 时属性名称无法正确呈现。

您可以更正您的示例,更改您的剃刀表单输入,如下所示:

发件人:

<input type="hidden" asp-for="@Model.Casas.ElementAt(i).Casaid" />

收件人:

<input type="hidden" name="modelo.Casas[@i].Casaid" value="@Model.Casas.ElementAt(i).Casaid" />

【讨论】:

  • 谢谢若昂!!!使用 [@i] 有效!!!然而 foreach 对我来说失败了。我将使用 for 语句和 [@i] 。再次感谢
  • 您可以使用 foreach 查看生成的 HTML 并尝试找出问题所在,但这也是同样的方法……很高兴为您提供帮助!
猜你喜欢
  • 2020-12-24
  • 1970-01-01
  • 2019-07-06
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多