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

时间:2017-02-15 14:38:58

标签: asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我正在使用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>

输入中的所有name属性均为AdvanceSearchModel。将多个模型传递给包含一个或多个表单的视图时,如何使用asp-for等标记帮助程序?在上述场景中提交表单后如何保留表单的值?

1 个答案:

答案 0 :(得分:1)

正如您在source code of InputTagHelper

中所看到的

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

你需要什么

您需要name

这样的SearchUserModel[0].Location格式代码

其中:

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

我的建议

不要做

  1. 扩展InputTagHelper并添加一个前缀选项(为名称添加一个prefex)。
  2. 使用视图模型不是元组!
  3. 创建一个只带SearchUserModel +前缀的局部视图(例如列表中的行,例如:usermodel[1]
  4. 在视图中循环显示列表并调用partial。
  5. 结果

    @model SearchUserModel
    <input asp-for="Location" my-prefix="ListItem[@Model.Id]" class="form-control" />
    

    更好的长期选择

    1. 制作一个HTML模板,说明表单的SearchUserModel部分的外观。
    2. 执行ajax调用以获取数据或将数据作为json放在视图中。 (或从不做的事情中采取步骤3)
    3. 使用结构良好的javascript生成表单。
    4. 提交提交而不是提交表单,将from解析为json并将其作为json ajax调用发送。
    5. 为什么我这样说?如果在控制器中出现奇怪的数据绑定,则更容易调试。

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

      列表的正确html名称标签的引用: