是否可以(在MVC 5中)在AjaxOptions的UpdateTargetId内使用剃刀来创建数量可变的按钮?

时间:2018-08-23 16:40:23

标签: asp.net-mvc razor asp.net-ajax

我有一个行数可变的模型,我希望每行旁边都有两个按钮:一个用于拒绝,一个用于确认。但是由于我事先不知道会有多少行,因此我尝试使用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="{&quot;caption&quot;:&quot;Confirm Mapping&quot;,&quot;buttonname&quot;:&quot;Confirm!909738&quot;,&quot;command&quot;:&quot;Confirm!909738&quot;,&quot;buttonclass&quot;:&quot;btn btn-danger&quot;,&quot;counterparty&quot;:&quot;909738&quot;}">
            <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以包含所有按钮描述,并在每次单击时重新提交整个内容,但是这里显示的方法对我来说似乎更自然。谢谢

0 个答案:

没有答案