我正在使用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>
输入中的所有名称属性都是AdvanceSearchModel.在将多个模型传递给包含一个或多个表单的视图时,如何使用asp-for等标记助手?在上述场景中提交表单后,如何保留表单的值?
最佳答案 正如你在
source code of InputTagHelper中看到的那样
你可以看到它根据html-tag:asp-for中的(lambda)表达式创建了name属性.
你需要什么
您需要一个像此SearchUserModel [0] .Location这样的表单名称标记
哪里:
> SearchUserModel是模型上的属性名称,它位于您发布到的控制器方法中
> [0]是列表中的索引
> Location是SearchUserModel实例列表中iten的属性
我的建议
不要做
>扩展InputTagHelper并添加前缀选项(为名称添加prefex).
>使用视图模型不是元组!
>创建一个仅为SearchUserModel添加前缀的局部视图(例如,列表中的行,例如:usermodel [1])
>在视图中循环遍历列表并调用partial.
结果
@model SearchUserModel
<input asp-for="Location" my-prefix="ListItem[@Model.Id]" class="form-control" />
更好的长期选择
>制作一个HTML模板,说明表单的SearchUserModel部分应该如何.
>执行ajax调用以获取数据或将数据作为json放在视图中. (或从不做的事情中采取第3步)
>使用结构良好的javascript生成表单.
> On提交而不是提交表单,将from解析为json并将其作为json ajax调用发送.
我为什么这么说?如果在控制器中获得奇怪的数据绑定,则更容易调试.
也就是说,选项1非常好,但是后来可能会导致问题,因为它是非常静态的模板,您无法轻松添加或删除行.
列表的正确html名称标签的引用:
> http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx
> How does MVC 4 List Model Binding work?