无法从mvc 5中的列表框项目传递Id

时间:2017-12-11 19:17:40

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

我已经编码了按钮点击时位于列表框内的多个值。我使用自动完成文本框来获取所需的值及其ID。然后我设法在列表框中添加这些值。现在我想要的是将id's传递给列表框中的那些值而不是名称。下面是我正在运行的代码。

StudentBatch.cs

 public string studentId { get; set; }
        public string StudentName { get; set; }
   public List<string> selectedids { get; set; }
        public List<string> names { get; set; }
        public List<string> SelectedNames { get; set; }

Create.cshtml

@using (Html.BeginForm("Create", "Student", FormMethod.Post))
{
<div class="form-group">
    <div class="col-md-12">
        @Html.EditorFor(model => model.StudentName, new { id = "StudentName" })
        <input type="button" value="Add Text" id="addtypevalue" />
        <div id="typevaluelist"></div>
    </div>
</div>

<div id="new" style="display:none;">
    <div class="typevalue">
        <input type="text" name="typevalue" />
        <button type="button" class="delete">Delete</button>
    </div>
</div>

<div id="hiddensq">
</div>

    for (int i = 0; i < Model.names.Count; i++)
    {
        @Html.Hidden("UserValues", Model.names[i]);
    }

@Html.ListBoxFor(m => m.SelectedNames, new SelectList(Model.names))


<div id="partialDiv">
    @{
        Html.RenderPartial("GetListBox", Model);
    }

</div>


<div class="form-group">
    <div class="col-md-offset-2 col-md-10">
        <input type="submit" value="Create" class="btn btn-default" />
    </div>
</div>
        }




<script type="text/javascript">

    $(document).ready(function () {
        $("#StudentName").autocomplete({
            //autocomplete: {
            //    delay: 0,
            //    minLength: 1,
            source: function (request, response)
            {
                $.ajax({
                    url: "/Student/CreateStudent",
                    type: "POST",
                    dataType: "json",
                    data: { Prefix: request.term },
                    success: function(data) {
                        try {
                            response($.map(data,
                                function (item)
                                {
                                    return { label: item.FirstName, id: item.Id };
                                }));
                        } catch (err) {
                        }
                    }
                });
            },
            messages:
                {
                noResults: "jhh", results: "jhjh"
            }

        });

    });
</script>





<script>

    $(function () {
        $('#addtypevalue').click(function (e) {

            var name = $("#StudentName").val();
            alert(name);
            $('#SelectedNames').
                append($("<option></option>").
                attr("value", name).
                text(name));

            $('#hiddensq').append("<input name='UserValues' type='hidden' value='"+ name +"'/>");
        });
    });
</script>

StudentController.cs

 public ActionResult Create()
        {
            Context.Student student = new Context.Student();
            Models.StudentBatch studBatch = new Models.StudentBatch();
            studBatch.names = new List<string>();
            studBatch.names.Add("Add Student Names");
            studBatch.BatchNumberList = student.getBatchList();
            return View(studBatch);
        }

        [HttpPost]
        public JsonResult CreateStudent(string Prefix)
        {
            CreateUser user = new CreateUser();
            string stdid = "f14570f0-e7a1-4c22-bf69-60ffbeb7e432";
            var StudentList1 = user.GetAllUsers().ToList().Where(u => u.FirstName.Contains(Prefix) && u.usertypeid == stdid);
            var StudentList = user.GetAllUsers().ToList();

            var searchlist = (from student in StudentList1
                              where student.FirstName.Contains(Prefix)
                              select student).ToList();


            return Json(StudentList1, JsonRequestBehavior.AllowGet);

        }


        // POST: Student/Create
        [HttpPost]
        public ActionResult Create(Models.StudentBatch student, IEnumerable<string> UserValues)
        {
            try
            {
                // TODO: Add insert logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

2 个答案:

答案 0 :(得分:0)

如果我理解正确,这里的问题是将多个ID从列表框传递到POST?一种可能的方法是在控制器中分配如此的视图包:

ViewBag.StudentList = new SelectList(db.StudentBatch, "studentId", "StudentName");

我使用实体访问我的模型,我认为你有一些不同的方法,但重点是给选择列表一个集合。然后指定数据值字段和数据文本字段。

然后在你的视图中,请注意它不是ListBoxFor,因为它是动态的:

@Html.ListBox("StudentList", null)

然后最终能够在POST中接收值,将以下参数添加到您的操作中,您应该能够遍历它:

string[] StudentList

答案 1 :(得分:0)

最后设法从列表框中获取相关内容。我按照特定问题中提到的说明进行操作。这就是我的表现。

 $("#StudentName").autocomplete({
    source: function (request, response) {
        $.ajax({
            cache: false,
            // async: false, NEVER do this
            url: '@Url.Action("CreateStudent", "Student")', // don't hard code your url's
            data: { Prefix: request.term }, // change
            dataType: "json",
            type: "POST",
            // contentType: "application/json; charset=utf-8", delete
            success: function (data) {
                response($.map(data, function (item) {
                    return {
                        label: item.label,
                        id: item.id
                    }
                }));
            }
        })
    },select: function(event, ui) {
        $.ajax({
            cache: false,
            type: "POST",
            url: '@Url.Action("GetDetails", "Student")',
            data: { id: ui.item.id },
            success: function (data) {
                var name = $("#StudentName").val();
                $('#SelectedNames').
               append($("<option></option>").
               attr("value", ui.item.id).
               text(name));
                $('#hiddensq').append("<input name='UserValues' type='hidden' value='" + ui.item.id + "'/>");

            }
        });
    }
});
</script>

并在控制器类中

[HttpPost]


   public JsonResult GetDetails(string id)
    {

        ViewBag.Value = id;

        return Json(ViewBag.Value, JsonRequestBehavior.AllowGet);
    }