【问题标题】:'result is not defined' post to controller with js'结果未定义' 使用 js 发布到控制器
【发布时间】:2019-08-17 20:38:27
【问题描述】:

我试图发布到 mvc.core 控制器 textarea 值 & id 值 & 我得到 js 错误“结果未定义” 以及控制器获取 id 值的唯一数据。 剃须刀:

   <div class="well">
    <div class="row">
        <form asp-action="AddToSellList" method="post" class="form-horizontal shadow" style="padding: 10px;">
            @foreach (var item in Model)
            {
                <div class="well well-sm" style="background-color: white;">
                    <div class=" row">
                        <div class="col-sm-10 pull-right text-right">

                            @* Prop *@

                            @foreach (var qestion in item.QAViewModel)
                            {
                                <div id="@item.Id" class="collapse" style="background-color: gray">
                                    <p>Qestion</p>

                                    @* Prop *@

                                    @foreach (var ansewr in qestion.Answers)
                                    {
                                        @* Prop *@
                                    }
                                </div>
                            }

                        </div>

                        <div class="col-sm-2">
                            <button class="btnShowModal btn btn-primary btnWhiteSpace" id="@item.Id" type="button" value="@item.Id">
                                @item.Id
                                <i class="fas fa-info-circle" aria-hidden="true"></i>
                            </button>
                            <button type="button" class="btn btn-info" data-toggle="collapse" data-target="#@item.Id"> <i class="fas fa-question-circle" aria-hidden="true"></i>Bla bla </button>
                        </div>
                    </div>

                </div>

                //Check box for selecting items for Action  AddToSellList
                <input type="checkbox" name="Hiden" value="@item.Id"/>
            }
            <button type="submit" id="btt"> submit to Action AddToSellList</button>
        </form>
    </div>
</div>





  <div class="modal fade" tabindex="-1" id="loginModal"
     data-keyboard="false" data-backdrop="static">
    <div class="modal-dialog modal-sm ">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">
                    <i class="fas fa-window-close"></i>
                </button>
                <h4 class="modal-title">moder for posting for _AskQ </h4>
            </div>
            <div class="modal-body ">
                <form asp-action="_AskQ" class="form-horizontal" style="padding: 10px; " method="post">
                    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

                    <input type="hidden" name="id" asp-for="@Model.First().SiteUserId" />
                    <div class="form-group">

                        <textarea name="Question" type="text" class="abc form-control text-right"id="a" required=""> </textarea>
                    </div>
                    <div class="modal-footer">
                        <button type="submit" class="btn btn-primary button button4">Ask</button>

                    </div>
                </form>

            </div>
        </div>
    </div>
</div>

js:`

<script type="text/javascript">
        $(document).ready(function() {
            $('.collapse').on('shown.bs.collapse',
                function() {
                    $(".collapse").addClass('glyphicon-chevron-up').removeClass('glyphicon-chevron-down');
                });
        });

    </script>
    <script type="text/javascript">

        $(document).ready(function() {
            $(".btnShowModal").click(function() {
                    $("#loginModal").modal('show');
                    var id = $(this).attr("id");

                    //$(".button4").click(function(e) {
                    //    e.preventDefault();
                    $(".button4").click(function() {
                        url = '@Url.Action("_AskQ", "Bid")';

                        const value = $.trim($("textarea").val());
                        if (value === "") {
                            alert(value);
                        }
                        var data = {
                            Id: id,
                            value: value
                    };

                        console.log(id);
                        console.log(value);
                        $.ajax({
                            url: url,
                            data: data,
                            type: "POST"
                        }).done(function(result) {
                            $(id).html(result);
                        }).fail(function(x, s, e) {
                            alert("failed: " + s);
                        });
                    });
                }
            );
        });

`

控制器:

[HttpPost]
    public IActionResult _AskQ(QAViewModel Vm)
    {
        if (!ModelState.IsValid)
        {
            return View(Vm);
        }

        var qustion = new QuoteQuestion
        {
            SiteUserId = _userManager.GetUserId(User),
            QuoteId = Vm.Id,
            Question = Vm.Question
        };

        _context.quoteQuestions.Add(qustion);
        _context.SaveChanges();
        if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
        {
            ViewBag.q = qustion.Question;
            ViewBag.Id = qustion.QuoteId;
            ViewBag.SiteUId = qustion.SiteUserId;
        }
        return RedirectToAction("Index");
    }
  public class QAViewModel
{
    public int QuoteQuestionId { get; set; }
    public int Id { get; set; }
    public string Question { get; set; }
    public string SiteUserId { get; set; }
    public virtual IList<Answers> Answers { get; set; }
}

在 ajax 调用后的数据中,我可以看到 Id 值和 Value 值,但它一直未能实际发布到控制器(仅限 Id 值)。 我从 ActionResult 名称 :index 到 ActionResult 名称 _AskQ 发帖

【问题讨论】:

  • 你能告诉你QAViewModel。您可能需要包含 [FromBody] 属性。
  • 你的控制器中_AskQ动作的返回是什么?检查textarea的名称是否与VM的属性一致。可以分享控制器的代码吗?
  • @AntonToshik Iv 更新了我的代码
  • @Xueli chen Iv 更新了我的代码

标签: javascript jquery post asp.net-core asp.net-ajax


【解决方案1】:

在你的代码中尝试以下更改,注意传递的数据名称要与action中的参数一致

                $(".button4").click(function() {
                    const value = $.trim($("textarea").val());
                    if (value === "") {
                        alert(value);
                    }
                    var Vm = {
                        Id: id,
                        Question: value
                };

                    console.log(id);
                    console.log(value);
                    $.ajax({
                        type: "POST",
                        url: "/Bid/_AskQ",
                        contentType: "application/json",
                        data: "json",
                        data: JSON.stringify(Vm),

                        success: function (result) {
                            $(id).html(result);
                        },

                        error: function (x, s, e) {
                            alert("failed: " + s);
                        }

                    });
                });

传递json类型数据时在参数上添加[FromBody]属性

    [HttpPost]
    public IActionResult _AskQ([FromBody]QAViewModel Vm)

那么_AskQ方法的返回值应该是你要渲染指定id的地方的html json结果。根据你的需要进行修改。

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2016-11-11
    • 2015-09-20
    相关资源
    最近更新 更多