另一个对象中的对象的剃刀

问题描述:

列表保存表单中的值我有另一个对象中的对象的剃刀

public class ClassA 
{ 
    public int ID { get; set; } 
    public List<ClassB> ClassBList { get; set; } 
} 


public class ClassB 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public bool IsValid { get; set; } 
} 

// View Model Razor is using 
public class IndexViewModel 
{ 
    public List<ClassA> ClassAList { get; set } 

    public IndexViewModel() 
    { 
     ClassAList = /*...init list from repository method...*/ 
    } 
} 

// POST method 
[HttpPost] 
public IActionResult Index(IndexViewModel model) 
{ 
    // Here is where only the model has the updated ClassA properties, but not their ClassB properties 

    return RedirectToAction("Index"); 
} 

在我的ViewModel我有ClassA的一个列表。在我看来,我希望将ClassA的列表放入一个表单以及它们包含的ClassB中,以便可以更新ClassA和ClassB对象。

所以,我认为我有

@for (int i = 0; i < Model.ClassA.Count(); i++) 
{ 
    <input asp-for="@Model.ClassA[i].ID" /> 

    @for (int j = 0; j < Model.ClassA[i].ClassBList.Count(); j++) 
    { 
     <input asp-for="@Model.ClassA[i].ClassBList[j].ID" /> 
     <input asp-for="@Model.ClassA[i].ClassBList[j].Name" /> 
     <input asp-for="@Model.ClassA[i].ClassBList[j].IsValid" /> 
    } 
} 

,这里是视图模型

public class IndexViewModel 
{ 
    public List<ClassA> ClassAList { get; set } 
} 

当表单提交,在POST方法中,ClassA的性能得到更新,但是,没有的该ClassA对象的ClassB属性。

有没有办法让ClassBList中的属性以及它的父类ClassA属性?

+0

什么类型的控制器动作传入模型?你在View上使用什么类型? – OctoCode

+0

也许你应该开始简单,没有嵌套属性的普通模型。因为你的表单绑定已经不正确,这表明你还没有解决这个简单的案例。 – poke

+0

@OctoCode所以View使用与表单提交给控制器相同的模型。在这种情况下,Razor使用“@model ViewModels.Home.IndexViewModel”,控制器也使用IndexViewModel。 – Daath

看来你有一个错误,这可能导致异常或绑定数据覆盖。

变化:

i < Model.ClassA[i].ClassBList.Count() 

要:

j < Model.ClassA[i].ClassBList.Count() 

还要确保,你的模型是一个类,而不是一个列表。

@model SomeViewModel and not @model List<ClassA> 
+1

OP的错误有很多假设。这是最好的部分答案。 – OctoCode

+0

@StephenMuecke它可以和更明智的是'模型SomeModelContainingAPropertyOfListClassACalledClassA' –

+0

它可以是它不需要。 OP没有显示他们正在使用的视图模型:) –