【问题标题】:MVC 5 DropDownListFor postback nullMVC 5 DropDownListFor 回发空
【发布时间】:2023-03-17 16:21:02
【问题描述】:

我正在尝试使用 @Html.DropDownListFor helper 和 jQuery AJAX 创建级联下拉列表。第一次加载总是完美的。所有下拉列表数据均已正确显示。但是,回发后,它总是命中 ModelState.IsValid = False 并且下拉列表变为空。以下是我的代码:

型号

Public Property Province As New List(Of SelectListItem)
Public Property City As New List(Of SelectListItem)
Public Property SelectedProvince As String
Public Property SelectedCity As String

控制器

Public Function SetEmployeeProfile() As ActionResult
    Dim loc As New clsLocation
    Dim provinces As List(Of Province)
    Dim model As New SetEmployeeProfileViewModel

    provinces = loc.GetProvinceList
    Dim sel As SelectListItem

    For Each p As Province In provinces
        sel = New SelectListItem
        sel.Text = p.ProvinceName
        sel.Value = p.ProvinceName
        model.Province.Add(sel)
    Next

    Return View(model)    

End Function

查看

@ModelType SetEmployeeProfileViewModel

    <div class="form-group">
        @Html.LabelFor(Function(m) m.Province, New With {.class = "col-md-2 control-label"})
        <div class="col-md-10">
            @Html.DropDownListFor(Function(m) m.Province, New SelectList(Model.Province, "Value", "Text", Model.SelectedProvince), New With {.class = "form-control"})
            @Html.ValidationMessageFor(Function(m) m.Province, "", New With {.class = "text-danger"})
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(Function(m) m.City, New With {.class = "col-md-2 control-label"})
        <div class="col-md-10">
            @Html.DropDownListFor(Function(m) m.City, New SelectList(Model.City, "Value", "Text", Model.SelectedCity), New With {.class = "form-control"})
            @Html.ValidationMessageFor(Function(m) m.City, "", New With {.class = "text-danger"})
        </div>
    </div>


<script type="text/javascript">
$(document).ready(function () {
    LoadCities();
});

$("#Province").change(function () {
    LoadCities();
});

function LoadCities() {
    var selectedItem = $("#Province").val();
    var ddlCities = $("#City");
    var statesProgress = $("#city-loading-progress");
    statesProgress.show();
    $.ajax({
        cache: false,
        type: "POST",
        url: "@(Url.Action("GetCities"))",
        data: { "provinceName": selectedItem },
        success: function (data) {
            ddlCities.html('');
            $.each(data, function (id, option) {
                ddlCities.append($('<option></option>').val(option.CityName).html(option.CityName));
            });
            statesProgress.hide();
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert('Failed to retrieve cities.');
            statesProgress.hide();
        }
    });
}

注意:我尝试在模型中添加 selectedProvince 属性并根据此post 实现,但问题仍然存在。省和市字段也会产生以下验证错误:

The value 'Bali' is invalid.  (Province)
The value 'Kuta' is invalid.  (City)

回发后的网址为: https://localhost:55500/Employee/SetEmployeeProfile?Sex=M&Dob=01%2F01%2F0001%2000%3A00%3A00&Province=System.Collections.Generic.List%601%5BSystem.Web.Mvc.SelectListItem%5D&City=System.Collections.Generic.List%601%5BSystem.Web.Mvc.SelectListItem%5D

输入查询字符串是否正常:Province=System.Collections.Generic.List?

【问题讨论】:

    标签: asp.net asp.net-mvc vb.net razor


    【解决方案1】:

    你的错误在这里

    @Html.DropDownListFor(Function(m) m.Province, New SelectList(Model.Province, "Value", "Text", Model.SelectedProvince), New With {.class = "form-control"})
    

    这里

    @Html.DropDownListFor(Function(m) m.City, New SelectList(Model.City, "Value", "Text", Model.SelectedCity), New With {.class = "form-control"})
    

    第一个下拉列表的@Html.DropDownListFor()的第一个参数应该是Function(m) m.SelectedProvince而不是Function(m) m.Province,第二个下拉列表应该是Function(m) m.SelectedCity而不是Function(m) m.City

    以下是修改后的部分代码:

    <div class="form-group">
        @Html.LabelFor(Function(m) m.Province, New With {.class = "col-md-2 control-label"})
        <div class="col-md-10">
            @Html.DropDownListFor(Function(m) m.SelectedProvince, New SelectList(Model.Province, "Value", "Text", Model.SelectedProvince), New With {.class = "form-control"})
            @Html.ValidationMessageFor(Function(m) m.Province, "", New With {.class = "text-danger"})
        </div>
    </div>
    
    <div class="form-group">
        @Html.LabelFor(Function(m) m.City, New With {.class = "col-md-2 control-label"})
        <div class="col-md-10">
            @Html.DropDownListFor(Function(m) m.SelectedCity, New SelectList(Model.City, "Value", "Text", Model.SelectedCity), New With {.class = "form-control"})
            @Html.ValidationMessageFor(Function(m) m.City, "", New With {.class = "text-danger"})
        </div>
    </div>
    

    【讨论】:

    • 您好,感谢您的回复。正如我上面提到的,我已经尝试使用 Function(m) m.SelectedProvince 根据 stackoverflow 上的另一篇文章没有运气。我在修改代码以遵循您的解决方案后再次确认,表单错误消息是:值 'System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]' 无效。回发后的下拉列表中没有任何价值。再次帮助 terima kasih banyak :)
    • 这个答案是正确的,如果它不起作用,您的代码中还有其他错误。您声明的 url 表明您还具有属性 ProvinceCity 的隐藏输入,或者已尝试将模型包含在 BeginForm 中作为路由参数。当属性 ProvinceCity 已经是 IEnumerable&lt;SelectListItem&gt; 时,在视图中创建另一个 IEnumerable&lt;SelectListItem&gt; 是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2019-11-20
    相关资源
    最近更新 更多