在我的数据库中,我已经为产品配置了字段:
这是实体的外观:
产品字段
ID(PK)
产品编号(FK)
标签(用作字段标签)
类型(文本,TextArea)
页面加载后,我的产品实体有一个页面模型,该模型具有一个导航属性,称为Fields of ProductField类型。用我的剃刀语法,我正在执行以下操作:
<form method="post">
@{
int i = 0;
if (Model.Product.Fields.Count > 0)
{
@foreach (var field in Model.Product.Fields)
{
if (field.Type == "Text")
{
<input id="txt_@i" type="text">
}
else if (field.Type == "Signature")
{
<textarea id="txtArea_@i"></textarea>
}
i++;
}
}
}
</form>
我遇到麻烦的部分是创建一个可以正确发布的ViewModel,以便我可以访问每个字段的值并将其存储在数据库中。
数据库中还有另一个表可以存储每个字段的值:
ProductFieldValue
ProductFieldId(FK)
UserId(填写表单的用户的ID)
值(该字段的值)
在类似的情况下使用Razor Pages或MVC建模绑定的正确方法是什么?
答案 0 :(得分:2)
要与Razor页面中的数据列表进行模型绑定,需要使用name
属性将所有数据传递到后端。
在PageModel中,声明要存储输入数据的列表
[BindProperty]
public List<string> DataStored { get; set; }
在剃刀视图中
<form method="post">
@{
int i = 0;
if (Model.Product.Fields.Count > 0)
{
@foreach (var field in Model.Product.Fields)
{
if (field.Type == "Text")
{
<input type="text" id="txt_@i" class="items" name="DataStored[@i]" />
}
else if (field.Type == "Signature")
{
<textarea id="txtArea_@i" class="items" name="DataStored[@i]" ></textarea>
}
i++;
}
}
}
如果您使用MVC,则接受“列表”作为操作参数。
[HttpPost]
public IActionResult Create(List<string> dataStored)