【问题标题】:AntiforgeryToken generation from using @Ajax.BeginForm()使用 @Ajax.BeginForm() 生成 AntiforgeryToken
【发布时间】:2020-03-03 11:29:26
【问题描述】:

我在 ajax 方法中手动生成防伪令牌时遇到问题。所以我的问题是如果我使用 ajax.beginform(),它会生成像 @html.beginform 这样的令牌吗?如果是这样,我如何将它与我的 ajax 方法一起使用?

请忽略视图中的长代码。我主要关心的是 ajax 方法。如果建议使用 beginForm(),我发布它是为了向您展示视图。

@*@Html.AntiForgeryToken()*@
<hr />
<div class="row">
    <div class="col-lg-6">
        <label><strong>Month:</strong></label>
    </div>
    <div class="col-lg-6">
        <label>@manning_HQ.Issue_Date</label>
    </div>
</div>
<div class="row">
    <div class="col-lg-6">
        <label><strong>Count:</strong></label>
    </div>
    <div class="col-lg-6">
        <label>@manning_HQ.Count</label>
    </div>
</div>
<div class="row">
    <div class="col-lg-6">
        <label><strong>Location:</strong></label>
    </div>
    <div class="col-lg-6">
        <label>@manning_HQ.Location_Name</label>
    </div>
</div>


<hr />
<div class="col-lg-4">
    <label>Recruitment Status :</label>
</div>
<div class="col-lg-3">
    <select id="recruitment_Status">
        <option value="0">
            Choose Status
        </option>
        @foreach (TBL_Recruitment_Status rec in recruitment_Status)
        {
            <option  value="@rec.Rec_Status_ID">
                @rec.Status_Name
            </option>
        }
    </select>
</div>
<div class="row">

    <div class="col-lg-12">

        <label><strong>Issue staff requisition:</strong></label>
    </div>
</div>
<div class="row">
    <div class="col-lg-6">
        <input type="radio" name="Decision" id="_123" value="Accepted" />
        Accepted
    </div>
    <div class="col-lg-6">
        <input type="radio" name="Decision" id="_456" value="Rejected" />
        Rejected
    </div>
</div>
<hr />

<div class="row" id="RejComment" hidden>
    <div class="col-lg-6">
        <label>Rejected Comment :</label>
    </div>
    <div class="col-lg-3">
        <textarea id="RetainedComment"></textarea>
    </div>
</div>
<br />

<div class="modal-footer" id="Save_Dicision" hidden>
    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
    <button type="button" class="btn btn-primary" onclick="saveDecision(@manning_HQ.Issue_Staff_ID)">Save</button>
</div>

<script>
    var DecesionCheck = false;
    var rejected = false;
    var reason = false;

    $(document).ready(function () {
        $('input[type=radio][name=Decision]').change(function () {
            if ($("input[name='Decision']:checked").val() == 'Accepted') {
                $('#RejComment').hide();
                $('#Save_Dicision').show();
                rejected = true;
            }
            if ($("input[name='Decision']:checked").val() == 'Rejected') {
                $('#RejComment').show();
                $('#Save_Dicision').show();

                rejected = true;
            }
        });
    });
    function saveDecision(ID) {
        var Decsion = $('input[name=Decision]:checked').val();
        var Reason = $('#recruitment_Status').val();
        //var token = $("[name='__RequestVerificationToken']").val();
        if (Decsion == "#_123") {
            if (DecesionCheck == true) {
                var Decsion = $('input[name=Decision]:checked').val();
                var optionalComment = $('#OptionalComment').val();
                $.ajax({
                    type: 'POST',
                    url: '/Staff_Requisition_HQ/Recruitment_Actions', 
                    data: {
                       // __RequestVerificationToken: token,
                        Issue_Staff_ID: ID,
                        Rec_Status_ID: Reason,
                        OpComment: RetainedComment,
                        RecDecison: Decsion,
                    },
                    success: function (result) {
                        $('#DescionDetailsPOPUP').modal('hide');
                        location.reload();
                    },
                    fail: function (xhr, textStatus, errorThrown) {
                        alert('request failed');
                    }
                });
            }


        }
        else {

            var Decsion = $('input[name=Decision]:checked').val();
            var RetainedComment = $('#RetainedComment').val();

            $.ajax({
                type: 'POST',
                url: '/Staff_Requisition_HQ/Recruitment_Actions',
                data: {
                    //__RequestVerificationToken: token,
                    Issue_Staff_ID: ID,
                    Rec_Status_ID: Reason,
                    Comment: RetainedComment, 
                    RecDecison: Decsion,

                },
                success: function (result) {
                    $('#DescionDetailsPOPUP').modal('hide');
                    location.reload();
                },
                fail: function (xhr, textStatus, errorThrown) {
                    alert('request failed');
                }
            });
        }

    }

</script>

【问题讨论】:

    标签: javascript asp.net-mvc asp.net-ajax csrf


    【解决方案1】:

    这是我的一个观点的Ajax.BeginForm 示例:

    <!-- FORM Atributo -->
    @using (Ajax.BeginForm(accionFormulario, "Atributos", new AjaxOptions() { OnSuccess = "onSuccessCreate" }, new { @id = "frmCreate" }))
    {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(model => model.AtributoId)
        @Html.HiddenFor(model => model.EmpresaId)
    
        <div class="modal-body">
            <div class="row">
                // the form inputs ....
            </div>
        </div>
    
        <div class="modal-footer">
            <button class="btn btn-secondary mx-1" type="button" data-dismiss="modal" aria-label="Close">@Global.Cancelar</button>
            <button class="btn btn-primary" type="submit"><strong>@Global.Guardar</strong></button>
        </div>
    }
    

    这会按预期生成 AntiForgeryToken:

    您可以像在视图中一样使用 javascript 捕获它。

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      相关资源
      最近更新 更多