首页 > 解决方案 > 如果从另一个视图的 ajax 调用启动,控制器不会返回视图

问题描述

目标

目前,我有一个具有以下目标的程序。该程序加载一个包含 X 行的表,其中每一行都有一个复选框,当我选择然后单击一个按钮时,字段中的值将写入结果视图中的一个字段。例如,如果我有一个名称字段Bob, John and Karen,如果我选择复选框 1 和 3,则名称Bob and Karen将写入下一个视图中的新文本字段。

我已经走了多远

到目前为止,我已经加载了我的表,当我选择复选框时,行 ID 被传递到一个控制器,在那里我可以查看它选择name并在每次迭代时将其写入一个新变量。

问题

我面临的问题是,在这一切结束时,当我尝试打开我的新视图时,尽管调用了该方法,但新视图没有加载到页面上并且没有显示错误。我怀疑这是因为我的 ajax 被用来调用控制器并且没有 sucess 功能,但我不确定如何做我想做的 ajax。见代码。

Tableview.cshtml 解释- 基本上这里发生的事情是,我得到每个已选中的复选框,并将其传递给 Home 控制器中的 selectMany 函数。这工作正常。`

var SaveList = function () {
  //  alert("Here");
    var arrItem = [];
    var commaseperatedIds =

        $("#projectsTable tr td input[type=checkbox]").each(function (index, val) {

            debugger
            var checkId = $(val).attr("Id");
            var arr = checkId.split('_');
            var currentCheckboxId = arr[1];

            var Ischecked= $("#" + checkId).is(":checked", true);

            if (Ischecked) {
                arrItem.push(currentCheckboxId);
            }

        })
    if (arrItem.length != 0) {

        commaseperatedIds = arrItem.toString();
        $.ajax({
            url:"/Home/SelectList",
            type: "POST",
            data: { ItemList: commaseperatedIds },
            sucess: function (response) {
                //Code here
            }
        })
    }

}

Home Controller- SelectList 说明- 在这里,我得到了 ID,对于每个 ID,我运行一个选择并获取名称字段。我在这里要完成的是,对于每个选中的复选框,我取名称,并将其附加到一个name中,然后在结果视图上加载该名称,names但在任何情况下我都无法显示视图。

    [HttpPost]
    //    public JsonResult SelectList(string ItemList)
    public ActionResult SelectList(string ItemList)
    {
        string[]arr = ItemList.Split(',');
        string name;
        foreach(var id in arr)
        {
            var currentId = id;

            var Report = from t in db.classList
                         select new
                         {
                             t.name
                         };

            name = Report.Select(e => e.name).FirstOrDefault();
        }
        //     return RedirectToAction("CreateMany");
        //     return View("CreateMany");
        return View("/Home/CreateMany");
        //      return Json("", JsonRequestBehavior.AllowGet);
    }

SelectMany 解释- 最后是最后一个函数,它只是一个返回视图。

public ActionResult CreateMany()
{

return View();
}

如果我能指出正确的方向,我将不胜感激。

问候

编辑

`

@model IEnumerable<Generator.Models.ACT_activitiesDescr>

@{
    ViewBag.Title = "Activities";
}
<head>
    <link href="//cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css" rel="stylesheet" type="text/css" />
    <script src="//cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>
</head>
@*<link href="@Url.Content("~/Scripts/datatables/jquery.dataTables.min.css")" rel="stylesheet" type="text/css" />*@
@*<!-- Page JS Plugins -->
    <script src="~/Scripts/datatables/jquery.dataTables.min.js"></script>

    <!-- Page JS Code -->
    <script src="~/Scripts/datatables/base_tables_datatables.js"></script>*@

<h3><u>  </u></h3>

@*<p style="font-size:25px">
    @Html.ActionLink("Add New Task", "Create")
</p>*@
<button type="button" class="button" id="button">Click Me!</button>
<a class="btn btn-success btn-block" onclick="SaveList()"> Open</a>
<table id="projectsTable" class="display table table-bordered table-primary ">
@*<table id="projectsTable" class="display" style="width:100%">*@
    <thead>
        <tr>
            <th>
                Select
            </th>
            <th>
                @*@Html.DisplayNameFor(model => model.REF_Projects.Project)*@
                Task
            </th>
            <th>
                Type
            </th>
            <th>
                Depart
            </th>
            <th>
                Report Period
            </th>
            <th>
                Submission Date
            </th>
            <th>Submitted By</th>
            <th>Details</th>

        </tr>
    </thead>
    @foreach (var item in Model)
    {
        <tr style="color:black;">
            <td><input type="checkbox" id="Check_@item.actID" name="check_@item.actID" />&nbsp;</td>
            <td>
                @*@Html.DisplayFor(modelItem => item.REF_Projects.Project)*@
                @if (item.proAct == "Project")
                {
                    @Html.DisplayFor(modelItem => item.REF_Projects.Project)
                }
                else
                {
                    @Html.DisplayFor(modelItem => item.REF_Activities.Activity)
                }
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.proAct)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.REF_Units.location)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.reportPs) - @Html.DisplayFor(modelItem => item.reportPe)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.enterDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.USER_users.fname) @Html.DisplayFor(modelItem => item.USER_users.lname)
            </td>

            <td>
                <button class="btn btn-sm btn-default" type="button" onclick="location.href='@Url.Action("Edit", "Act", new { id = item.actID  })'" data-toggle="tooltip" title="Details">@*<i class="fa fa-list-ol"></i>*@View Details</button>
                @*@Html.ActionLink("Edit", "Edit", new { id = item.actID }) |
                    @Html.ActionLink("Details", "Details", new { id = item.actID }) |
                    @Html.ActionLink("Delete", "Delete", new { id = item.actID })*@
            </td>
        </tr>
    }

</table>
<script>

    var SaveList = function () {
      //  alert("Here");
        var arrItem = [];
        var commaseperatedIds =

            $("#projectsTable tr td input[type=checkbox]").each(function (index, val) {

                debugger
                var checkId = $(val).attr("Id");
                var arr = checkId.split('_');
                var currentCheckboxId = arr[1];

                var Ischecked= $("#" + checkId).is(":checked", true);

                if (Ischecked) {
                    arrItem.push(currentCheckboxId);
                }

            })
        if (arrItem.length != 0) {

            commaseperatedIds = arrItem.toString();
            $.ajax({
                url:"/Act/SelectList",
                type: "POST",
                data: { ItemList: commaseperatedIds },
                sucess: function (response) {
                    //Code here
                }
            })
        }

    }
</script>

`

标签: c#jqueryasp.netajaxasp.net-mvc

解决方案


如果我正确理解这一点,您只需要发布到 home/createmany 中的逻辑所在的页面?

你不需要ajax,只是一个表格

<form action="/form/createMany" method=""Post" >
 <!-- you need your check boxes, keep them all the same name -->     
 <input type="checkbox" name="MyChecks" value="Bob" /> Bob<br/>
 <input type="checkbox" name="MyChecks" value="Karen" />Karen</br> 
  ... 
 <!-- then your submit -->
 <input type="submit" name="SUB" value="CREATE MANY" />
</form>

在表单中添加您想要的任何其他内容后,您可以转到控制器进行 createmany。仅当从此表单传递数据时,您才可以使用提交按钮值进行处理

string fromForm = Request.Form["SUB"];
if(fromForm == "CREATE MANY"){
    string names = Request.Form["MyChecks"];  //should return selected as CSV
    string[] myArr = names.Split(',');
    // add your logic here from your ajax call   
}

推荐阅读