【问题标题】:ASP.NET Core using two models in single formASP.NET Core 以单一形式使用两个模型
【发布时间】:2017-02-15 14:38:58
【问题描述】:

我正在使用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?另外,在上述情况下提交表单后如何保留表单的值?

【问题讨论】:

  • 在表单中编辑数据时不能使用Tuple - 当您提交表单时它永远不会绑定到任何东西,因为Tuple 没有无参数构造函数,DefaultModelBinder 不能初始化它。使用视图模型。

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


【解决方案1】:

正如您在source code of InputTagHelper 中看到的那样

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

你需要什么

你需要一个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" />

更好的长期选择

  1. 制作一个 HTML 模板,说明表单中 SearchUserModel 部分的外观。
  2. 执行 ajax 调用以获取数据或将数据以 json 格式显示在您的视图中。 (或从不做的事情中采取第 3 步)
  3. 使用结构良好的 javascript 生成表单。
  4. 提交时不提交表单,而是将 from 解析为 json 并将其作为 json ajax 调用发送。

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

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

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

【讨论】:

  • 谢谢乔尔的详细回答。我的第二个选择是使用 anularjs。通过 API 发送表单值并以 JSON 格式获取结果并使用 angularjs 将其显示在页面上。现在我会坚持使用 angularjs 选项。
猜你喜欢
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2019-04-18
相关资源
最近更新 更多