模型绑定从ASP.NET Core Razor Pages / MVC中的配置创建的表单

时间:2019-01-09 02:50:47

标签: c# razor asp.net-core asp.net-core-mvc razor-pages

在我的数据库中,我已经为产品配置了字段:

这是实体的外观:

产品字段
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建模绑定的正确方法是什么?

1 个答案:

答案 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)