如何通过多选择框来MVC控制器动态创建的选项 [英] how to pass dynamically created options in multi select box to MVC controller

查看:109
本文介绍了如何通过多选择框来MVC控制器动态创建的选项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请帮忙。我使用MVC,剃须刀3,jQuery的。
我动态创建一个多选择框,当一个下拉选择更改。我的多重选择绑定到我的模型列表。和它的作品,但它传递了我选择的指数的关系的列表,而不是选定的文本列表。我想选定的文本,而不是列表索引。我设置的值作为文本,但我有没有运气。

Please help. I'm using MVC, razor 3, jquery. I dynamically create a multi select box when a dropdown selection changes. I bind the multiple selection to a List in my model. And it works, except it passes me the list of selected indice, instead of a list of the selected text. I want selected text, not index of the list. I set the value as text, but I have no luck.

如果我手动创建列表,一切正常。我如何通过选定的选项列表回控制器?

if I manually create the list, everything works. How do I pass a list of selected options back to the controller?

我有这个格在我看来:

    <div class="row-fluid" id="divAvailableAssemblies"  hidden ="hidden">
    <label class="span4">Available Assemblies:</label>
    <select multiple="multiple" class="span8 ui-corner-all" id="Request_SelectingAssemblies" name="Request.SelectingAssemblies">
        @*<option value="test">test</option>
        <option value="test2">test2</option>*@

    </select>

</div>

下面我jQuery的:

Here my jquery:

<script type="text/javascript">
$(function () {
    $('#ddPartsToCreate').live('change',function () {
        var selectedPart = this.value;
        if (selectedPart < 6 || $("#txtOrderNumber").val()=="")
        {
            $("#divAvailableAssemblies").attr("hidden", "hidden");
            return;
        }

        $("#divAvailableAssemblies").removeAttr("hidden");

        $.ajax({
            type: 'POST',
            url: '@Url.Action("GetSelectingAssembliesFromOrder", "Home")',
            data: JSON.stringify({ orderNumber: $("#txtOrderNumber").val() }),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            cache: false,
            async: false,
            success: function (response) {
                var returnedData = JSON.parse(response);

                var selectingAssemblies = $("#Request_SelectingAssemblies");

                selectingAssemblies.empty();

                for (var assembly in returnedData)
                {
                    //selectingAssemblies.append($('<option >', { value: assembly }).text(returnedData[assembly].Text)).hide().show();
                    //selectingAssemblies.append($('<option value=' + assembly + '>' + returnedData[assembly].Text + '</option>'));
                    //selectingAssemblies.append($('<option >', { value: assembly, text: returnedData[assembly].Text }));
                    //selectingAssemblies.append($('<option></option>').val(assembly).html(returnedData[assembly].Text));
                    //$("#Request_SelectingAssemblies").append($('<option>', { value: assembly }).text(returnedData[assembly].Text));

                    //$("#Request_SelectingAssemblies").append($('<option>', { value: assembly }).text(returnedData[assembly].Text));
                    //$('<option />', { value: assembly, text: returnedData[assembly].Text }).appendTo(selectingAssemblies);
                    selectingAssemblies.append($('<option></option>').val(assembly).html(returnedData[assembly].Text));


                }

            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(errorThrown);
            }
        });
    });

});

在后台,我产生JSON:

in the backend, I generate JSON:

            foreach (var assembly in pr.ShipParts)
        {
            sb.Append(String.Format(",{{\"Text\":\"{0}\", \"Value\":\"{1}\"}}", assembly.Mark.ToString(), assembly.Mark.ToString()));
            availableAssemblies.Add(assembly.Mark.ToString());

        }

我绑定了多个选择(Request_SelectingAssemblies)与此属性在我的模型:

I bind the multiple selection(Request_SelectingAssemblies) with this property in my model:

      public List<String> SelectingAssemblies
  {
      get
      {

          return _SelectingAssemblies;
      }
      set
      {
          _SelectingAssemblies = value;
      }
  }
  private List<String> _SelectingAssemblies = new List<string>();

当它到达我的行动控制器,SelectingAssemblies的索引,而不是实际的文本。但是我设置每个选项为文本的价值。如果我手动设置选项,他们会表现出源页面并返回文本。但因为我动态创建的选项,他们不会在源代码页面显示。我不知道我怎样才能使MVC理解动态数据。
在图片中,CX001,RBX001列表,动态创建RBX002。如果我在IE打F12,我会看到他们在DOM正确创建。如果让我选择CX001和RBX002,SelectionAssembies将有0和2。

When it gets to my action in the controller, SelectingAssemblies has index instead of the actual text. But I set the value of each option as text. If I set the option manually, they will show in source page and return the text. But since I dynamically create the options, they don't show in source page. I don't know how I can make MVC understand dynamic data. In the picture, the list of CX001, RBX001, RBX002 is dynamically created. if I hit F12 in IE, I will see them created correctly in the DOM. If I choose CX001 and RBX002, SelectionAssembies will have 0 and 2.


谢谢

Thanks

推荐答案

这是最新的和工作code,感谢@StephenMuecke:

This is the latest and working code, thanks to @StephenMuecke:

<script type="text/javascript">
$(function () {
        $('#ddPartsToCreate').live('change',function () {
        var selectedPart = this.value;
        if (selectedPart < 6 || $("#txtOrderNumber").val()=="")
        {
            $("#divAvailableAssemblies").attr("hidden", "hidden");
            return;
        }

        $("#divAvailableAssemblies").removeAttr("hidden");

        $.ajax({
            type: 'POST',
            url: '@Url.Action("GetSelectingAssembliesFromOrder", "Home")',
            data: JSON.stringify({ orderNumber: $("#txtOrderNumber").val() }),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            cache: false,
            async: false,
            success: function (response) {
                var returnedData = JSON.parse(response);
                var selectingAssemblies = $("#Request_SelectingAssemblies");
                $.each(returnedData, function (index, item) {
                    selectingAssemblies.append($('<option></option>').val(item.Value).html(item.Text));
                });

            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(errorThrown);
            }
        });
    });


});

    public ActionResult GetSelectingAssembliesFromOrder(String orderNumber)
    {
        return Json(model.GetSelectingAssembliesFromOrder(orderNumber), JsonRequestBehavior.AllowGet);
    }



    public String GetSelectingAssembliesFromOrder(String orderNumber)
    {
       //...
        StringBuilder sb = new StringBuilder();
        sb.Append("[");
        foreach (var assembly in pr.ShipParts)
        {
            string assemblyName = assembly.Mark.Trim();
            sb.Append(String.Format(",{{\"Text\":\"{0}\", \"Value\":\"{1}\"}}", assemblyName, assemblyName));//JSON to build the list
            //...
        }

        sb.Append("]");
        sb.Remove(1, 1);//remove extra comma
        _db.SaveChanges();
        return sb.ToString();
    }

这篇关于如何通过多选择框来MVC控制器动态创建的选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆