ASP.NET Core以单一形式使用两个模型

Bha*_*dav 5 asp.net asp.net-mvc asp.net-core-mvc asp.net-core

Tuple用来传递视图内的两个模型,如下所示。

@model Tuple<AdvanceSearchModel, List<SearchUserModel>>
<form role="search" method="post" action="/Public/AdvanceSearch">
            <div class="form-group">
                <label>Name</label>
                <input name="FullNames" type="text" class="form-control" value=""/>
            </div>
            <div class="form-group">
                <label>Product</label>
                <input name="Products" type="text" class="form-control" value="" />
            </div>
            <div class="form-group">
                <label>Location:</label>
                <input name="Location" type="text" class="form-control" value="" />
            </div>
            <div class="form-group">
                <label>State</label>
                <input name="States" type="text" class="form-control" value="" />
            </div>
            <div class="form-group">
                <label>Country</label>
                <input name="Countries" type="text" class="form-control" value=""/>
            </div>
        </form>
Run Code Online (Sandbox Code Playgroud)

name输入中的所有属性均为AdvanceSearchModelasp-for当将多个模型传递到包含一个或多个表单的视图时,如何使用标记帮助器?在上述情况下提交表单后,如何保留表单的值?

Joe*_*kes 1

正如您在InputTagHelper的源代码中看到的

name您可以看到它根据 html-tag: 中的 (lambda) 表达式创建属性asp-for

你需要什么

你需要一个name像这样的表单标签SearchUserModel[0].Location

在哪里:

  • SearchUserModel是模型上的属性名称,位于您发布到的控制器方法中
  • [0]是列表中的索引
  • LocationSearchUserModel是实例列表中iten的属性

我的建议

不做

  1. 扩展 InputTagHelper 并添加前缀选项(这会向名称添加前缀)。
  2. 使用视图模型而不是元组!
  3. 创建一个仅采用SearchUserModel+ 前缀的部分视图(例如,代表列表中哪一行的 int usermodel[1]:)
  4. 在您的视图中循环列表并调用部分。

结果

@model SearchUserModel
<input asp-for="Location" my-prefix="ListItem[@Model.Id]" class="form-control" />
Run Code Online (Sandbox Code Playgroud)

更好的长期选择

  1. 制作一个关于SearchUserModel表单部分的外观的 HTML 模板。
  2. 执行 ajax 调用来获取数据或将数据作为 json 放入视图中。(或者从不该做的事情中执行步骤 3)
  3. 使用结构良好的 JavaScript 生成表单。
  4. 提交时,不是提交表单,而是将 from 解析为 json 并将其作为 json ajax 调用发送。

我为什么这么说呢?如果控制器中出现奇怪的数据绑定,调试起来会更容易。

也就是说,选项 1 非常好,但以后可能会导致问题,因为它是非常静态的模板,您将无法轻松添加或删除行。

列表的正确 html 名称标签参考: