Второй DropdownList не будет заполнен - PullRequest
0 голосов
/ 02 января 2019

Я использовал два каскадных DDL на своей странице. Метод работы заключается в том, что при изменении выбранного элемента DDL1 соответствующая информация должна быть заполнена в DDL2. Я использовал jQuery для вызова функции-заполнителя DDL2: Когда я выбираю элемент DDL1, вызывается функция FillTypes и соответствующие записи передаются в jQuery, но этот элемент не заполняется в DDL2. Я не знаю, где моя проблема?

я прикрепил скриншот

Code

DDl2 runtime, Which is not filled

Browser debug mode

контроллер:

 ' GET: MachinInfo/Create
        Function MachinInfoAdd() As ActionResult
            ViewBag.BrandID = New SelectList(db.Brand, "Id", "BrandName")
            ViewBag.MachineID = New SelectList(db.MachinKind, "Id", "MachinName")
            ViewBag.MachinStateID = New SelectList(db.MachinState, "Id", "Title")
            ViewBag.PelakStateID = New SelectList(db.PelakState, "Id", "Title")
            ViewBag.GeartypeID = New SelectList(db.GearType, "Id", "Title")

            Return View()


        End Function

        ' POST: MachinInfo/Create
        'To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        'more details see https://go.microsoft.com/fwlink/?LinkId=317598.
        <HttpPost()>
        <ValidateAntiForgeryToken()>
        Function MachinInfoAdd(<Bind(Include:="Id,PelakStateID,MachinStateID,OrgCode,MachineID,BrandID,MachintypeID,NPlate,NPlateL,NPlateM,NPlateR,CardSerial,VIN,Chasis,Motor,Myear,Color,GearTypeID,MCost,Mcamp,Description")> ByVal machinInfo As MachinInfo) As ActionResult
            If ModelState.IsValid Then
                ' If machinInfo.NPlate Is Nothing = False Then machinInfo.NPlate = machinInfo.NPlate.Replace("ایران", "").Replace(" ", "").Replace("-", "")
                db.MachinInfo.Add(machinInfo)
                db.SaveChanges()
                Return RedirectToAction("Index")
            End If

            ViewBag.BrandID = New SelectList(db.Brand, "Id", "BrandName", "SelectedBrandID")
            ViewBag.MachineID = New SelectList(db.MachinKind, "Id", "MachinName")
            ViewBag.MachinStateID = New SelectList(db.MachinState, "Id", "Title")
            ViewBag.PelakStateID = New SelectList(db.PelakState, "Id", "Title")
            ViewBag.GeartypeID = New SelectList(db.GearType, "Id", "Title")
            Return View(machinInfo)
        End Function
        
        
          Public Function FillTypes(ByVal MachinKindId As Integer) As JsonResult

            Dim MachinTypes = db.MachinType.Where(Function(c) c.MachinKindId = MachinKindId).ToArray
            Return Json(MachinTypes, JsonRequestBehavior.AllowGet)

        End Function

Модель:

Partial Public Class MachinType
    Public Property Id As Integer
    Public Property MachinTypeName As String
    Public Property BrandId As Integer
    Public Property MachinKindId As Integer

    Public Overridable Property MachinInfo As ICollection(Of MachinInfo) = New HashSet(Of MachinInfo)
    Public Overridable Property Brand As Brand
    Public Overridable Property MachinKind As MachinKind

End Class

вид:

@ModelType Machinary.MachinInfo
@Code
    Layout = "~/Views/Shared/_Layout.vbhtml"
End Code

@Using (Html.BeginForm("MachinInfoAdd", "MachinInfo", FormMethod.Post))

    @Html.AntiForgeryToken()

    @<div class="panel">
      

        <div Class="form-horizontal panel-body">

            @Html.ValidationSummary(True, "", New With {.class = "text-danger"})
            

            <div class="row">
                <div class="form-group col-md-6">
                    @Html.LabelFor(Function(model) model.MachintypeID, htmlAttributes:=New With {.class = "control-label col-md-2"})
                    <div class="col-md-10">
                        <select id="MachintypeID" name="MachintypeID" class="form-control"></select>
                    </div>
                </div>
                <div class="form-group col-md-6">
                    
                     @Html.LabelFor(Function(model) model.MachineID, htmlAttributes:=New With {.class = "control-label col-md-2"})
                <div class="col-md-10">
                    @Html.DropDownList("MachineID", Nothing, "انتخاب کنید", htmlAttributes:=New With {.class = "form-control"})
                    @Html.ValidationMessageFor(Function(model) model.MachineID, "", New With {.class = "text-danger"})
                </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="ُSave" class="btn btn-success" />
                </div>
            </div>
            <br />
              </div>
              End Using




@section MyScripts

    <script type="text/javascript">
        $(function () {
            $('#MachineID').change(function () {
                var machineid = $(this).val();
                $.ajax({
                    type: "post",
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    url: "FillTypes",
                    data: "{MachinKindId:'" + machineid + "'}",
                    success: function (data) {
                        $('#MachintypeID').empty();
                        $('#MachintypeID').append('<option selected="selected" value="">Select Machintype</option>')
                        $.each(data, function (i, d) {
                            $('#MachintypeID').append('<option value=' + d.Id + '>' + d.MachinTypeName + '</option>');
                        });

                    },
                    failure: function (data) {
                        alert('error occured');
                    }

                });
            });
        });
    </script>
End Section

Ответы [ 2 ]

0 голосов
/ 03 января 2019

С тестами, которые я сделал, я понял, что проблема в разделе цикла кода высока.Потому что часть цикла никогда не запускается.alert('a') всегда работает, но alert('b') никогда не виден.И помните, что функция FillTypes вернет записи

success: function (data) {
                    $('#MachintypeID').empty();
                    $('#MachintypeID').append('<option selected="selected" value="">Select Machintype</option>')
                    alert('a');
                    $.each(data, function (i, d) {
                        //$('#MachintypeID').append('<option>' + d.MachinTypeName + '</option>');
                        alert('b' );
                    });

                },`
0 голосов
/ 02 января 2019

Поскольку вы хотите передать значение MachinKindId в качестве одного параметра, нет необходимости использовать настройку contentType, просто передайте его напрямую вместо этого с помощью метода GET:

$.ajax({
    type: "GET", // use GET method
    dataType: "json",
    url: '@Url.Action("FillTypes", "ControllerName")',
    data: { MachinKindId: machineid },
    success: function (data) {
        $('#MachintypeID').empty();
        $('#MachintypeID').append('<option selected="selected" value="">Select Machintype</option>')
        $.each(data, function (i, d) {
            $('#MachintypeID').append('<option value=' + d.Id + '>' + d.MachinTypeName + '</option>');
        });
    },
    failure: function (data) {
        alert('error occured');
    }
});

Примечание:

Я заметил, что вы не используете атрибут <HttpPost()> поверх действия FillTypes и используется JsonRequestBehavior.AllowGet, поэтому параметр type должен быть установлен как GET, потому что по умолчанию методы действия имеют неявный <HttpGet()> атрибут, если не указан атрибут <HttpPost()>.

...