我有一个说有10个属性的模型。 A,B,C等......
属性A
是一个数组。
对于数组中的每个值,我生成一个这样的标记:
<div class="col-sm-10 row">
@foreach (var item in Model.A)
{
<div class="col-sm-1 right-buffer">
<a href="@item.Value"><i class="" aria-hidden="true">@item.Text</i></a>
</div>
}
</div>
当用户点击某个链接时,我应该将其重定向到同一页面,但更改了某些模型属性。例如:
当前网址:my/controller/someaction?name=Alex&age=20&from=fr&CurrentA=
模型?name=Alex&age=20&from=fr&CurrentA=
如果用户点击<a>
文字为foo
,则应在my/controller/someaction?name=Alex&age=20&from=fr&CurrentA=foo
上重定向
然后点击<a>
,文字为bar
,现在应该在my/controller/someaction?name=Alex&age=20&from=fr&CurrentA=bar
上重定向
因此,应保留整个查询字符串(一个参数除外)以将当前模型状态发送到服务器,同时我想设置一个值并将其重定向到同一页面但具有新值。
最终,它应该像postback with one extra value setted to model
是否可以使用JS并自己执行所有操作?
答案 0 :(得分:1)
我手动解决了这个问题:
首先,为模型中的每个属性创建隐藏字段:
<form asp-controller="search" asp-action="index" method="get" role="form" id="searchForm" asp-antiforgery="false">
<input asp-for="SessionId" type="hidden" name="sessionId" value="@Model.SessionId" />
<input asp-for="Quantity" type="hidden" name="quantity" value="@Model.Quantity"/>
<input asp-for="SortField" type="hidden" name="sortField" value="@Model.SortField"/>
<input asp-for="IsAscending" type="hidden" name="IsAscending" value="@Model.IsAscending" />
<input asp-for="Offset" type="hidden" name="offset" value="0" />
...
</form>
然后,使用JS替换隐藏字段中的值,然后提交表单。来自输入的值将在查询字符串中自动转换,因此一切正常:
function sortDocuments(sortField) {
var sField = document.getElementById('SortField');
var isDescending = document.getElementById('IsAscending');
if (sField.value === sortField) {
if (isDescending.value.toUpperCase() === 'FALSE') {
isDescending.value = 'TRUE';
} else {
sField.value = 'rank';
isDescending.value = 'FALSE';
}
} else {
sField.value = sortField;
isDescending.value = 'FALSE';
}
document.getElementById('searchForm').submit();
}
不是很优雅,但它确实起作用。