我有一个行数可变的模型,我希望每行旁边都有两个按钮:一个用于拒绝,一个用于确认。但是由于我事先不知道会有多少行,因此我尝试使用UpdateTargetId中的剃刀动态生成按钮。想法是将每个按钮与一个名称相关联,以便操作可以执行一些有用的操作(尚未编码),并更改按钮的颜色以显示操作已完成。那可能吗?这是我的代码。
我想指出,我可以对UpdateTargetId使用常规字符串。在这种情况下,每次单击按钮都会刷新第一个按钮,这表明代码基本上可以正常工作。唯一不起作用的部分是用动态字符串替换 correct 按钮。
我的主视图在循环内渲染按钮:
@foreach (string element in cs)
{
<td>
@element
</td>
}
@if (ligne_spread > 0)
{
@Html.Partial("_ajaxnamedButton", Model.GetRefuseButton(ctpty));
@Html.Partial("_ajaxnamedButton", Model.GetConfirmButton(ctpty));
}
@{ ligne_spread++;
}
局部视图_ajaxnamedButton是(请注意 UpdateTargetId 和 div id 行)。
@model namedButtonViewModel
@{
string json_namedButtonViewModel, buttonname;
buttonname = Model.buttonname;
json_namedButtonViewModel = Model.json();
}
<td>
@using (Ajax.BeginForm("CreditSpreads", "Home", new AjaxOptions
{
HttpMethod = "post",
InsertionMode = InsertionMode.ReplaceWith,
UpdateTargetId = buttonname
}))
{
<div id="@(buttonname)" class="table-responsive">
<input type="hidden" name="caption" class="form-control" id="desc" value="@Model.caption">
<input type="hidden" name="buttonname" class="form-control" id="desc" value="@Model.buttonname">
<input type="hidden" name="command" class="form-control" id="desc" value="@Model.command">
<input type="hidden" name="buttonclass" class="form-control" id="desc" value="@Model.buttonclass">
<input type="hidden" name="counterparty" class="form-control" id="desc" value="@Model.counterparty">
<input type="hidden" name="jsonbutton" class="form-control" id="desc" value="@json_namedButtonViewModel">
<button type="submit" name="decision" value="@Model.command" id="CreditSpreads" formaction="CreditSpreads" class="@Model.buttonclass">@Model.caption</button>
</div>
}
</td>
控制器操作是这样的:
public ActionResult CreditSpreads(namedButtonViewModel nbVM, string jsonbutton, string decision)
{
ModelState.Remove("buttonclass"); // is this needed ??
nbVM.readjson(jsonbutton);
nbVM.Decide(decision);
return PartialView("_ajaxnamedButton", nbVM);
}
namedButtonViewModel很简单:5个字符串属性,它具有以下方法:
public void Decide(string decision)
{
buttonclass = "btn btn-danger";
}
因此,在单击按钮时,将调用Action,正确填充nbVM,但部分视图不会更新按钮。如上所述,通过使用常规字符串,我只能获取第一个按钮进行更新。
我尝试调试这是firefox(萤火虫),这是响应。
<td> <form action="/XVAInterface/Home/CreditSpreads" data-ajax="true" data-ajax-method="post" data-ajax-mode="replace-with" data-ajax-update="#Confirm!909738" id="form0" method="post">
<div id="Confirm!909738" class="table-responsive">
<input type="hidden" name="caption" class="form-control" id="desc" value="Confirm Mapping">
<input type="hidden" name="buttonname" class="form-control" id="desc" value="Confirm!909738">
<input type="hidden" name="command" class="form-control" id="desc" value="Confirm!909738">
<input type="hidden" name="buttonclass" class="form-control" id="desc" value="btn btn-danger">
<input type="hidden" name="counterparty" class="form-control" id="desc" value="909738">
<input type="hidden" name="jsonbutton" class="form-control" id="desc" value="{"caption":"Confirm Mapping","buttonname":"Confirm!909738","command":"Confirm!909738","buttonclass":"btn btn-danger","counterparty":"909738"}">
<button type="submit" name="decision" value="Confirm!909738" id="CreditSpreads" formaction="CreditSpreads" class="btn btn-danger">Confirm Mapping</button>
</div> </form></td>
我明白了
data-ajax-update="#Confirm!909738"
匹配
div id="Confirm!909738"
那是什么问题?它在#内匹配,但与我使用直字符串时相同。
我正在尝试的可能吗?我知道我可以重写ViewModel以包含所有按钮描述,并在每次单击时重新提交整个内容,但是这里显示的方法对我来说似乎更自然。谢谢