在我的ViewModel中(也在我的域模型中),我有一个动态的属性结构,其中Profile元素是基类ProfileVM
的List并引用ProfileDefinitionElement(只是为了解释ViewModel而不粘贴完整的事情)。
public class OwnProfileVM
{
public OwnProfileVM() {}
public ProfileDefinitionVM ProfileDefinitionVM { get; set; }
public ProfileVM ProfileVM { get; set; }
}
所以我使用Linq Single语句绑定我的属性:
@Model.ProfileDefinitionVM.ProfileElementDefinitions.Single(p => p.Key == ProfileElementKey.CompanyName.ToString()).Title
这适用于显示数据。但是当这样回帖时:
@Html.TextBoxFor(model => ((ProfileElementTextVM)model.ProfileVM.ProfileElements
.Single(p=> p.ProfileElementDefinition.Key == ProfileElementKey.CompanyName.ToString()))
.Text
..模型属性为null。
这是因为无参数构造函数构建了OwnProfileVM
对象而没有填充任何属性。
经过一番研究后,我发现有两种方法可以解决这个问题:
现在我的问题:
答案 0 :(得分:1)
看起来很复杂。最好简化一下。
根据我的经验,控制器中的模型属性为null,因为绑定器无法理解如何将表单元素名称与关联属性相关联。例如,我已经在使用foreach的列表中看到了它:
(model has a) List<Something> Somethings.....
foreach (Something thing in Model.Somethings)
{
@Html.EditorFor(m => thing)
}
这会在生成的html中呈现为<input name="thing".....
,这是无用的。这里的解决方案是使用for循环并通过其路径访问模型的属性,而不是复制指向实例的指针,例如:
for (int i = 0; i < Model.Somethings.Count; i++)
{
@Html.EditorFor(m => Model.Somethings[i])
}
然后使用正确的<input name="Model.Somethings[i]".....
进行渲染,模型绑定器将理解它。
我希望你在这里遇到的这个问题是类似的。您需要向属性添加必要的访问器,以便在视图中呈现正确的名称和ID,并由活页夹拾取。
我不确定你班级的确切定义,所以这个例子不太可能完全正确。
此类包含一个this [string index]方法,该方法将使用属性键作为索引来获取和设置元素:
public class ProfileElements : List<ProfileElement>
{
public ProfileElement this[string index]
{
get
{
return base.First(p => p.ProfileElementDefinition.Key == index);
}
set
{
base[index] = value;
}
}
}
在您看来,您可以使用它:
@Html.TextBoxFor(model => model.ProfileVM.ProfileElements[ProfileElementKey.CompanyName.ToString()].Text)
希望这可以满足您的需求。