【问题标题】:struggling to keep ViewModel data on drop down post back努力将 ViewModel 数据保留在下拉回传中
【发布时间】:2015-04-18 10:48:13
【问题描述】:

我有下拉更改事件,但我一直丢失视图模型数据。我搜索了谷歌,但找不到与此问题相关的答案

我怎样才能保留输入的数据,以便在每个 PostBack(dropdown onchanged 事件) 上我可以重新填充表单,这样用户就不必继续输入,例如每次回帖的密码

我有 2 个需要调用的 onchanged 事件,以便将正确的数据填充到下一个下拉列表中...这很好,但在我的视图模型中输入的数据会消失

我尝试了很多东西,但似乎无法弄清楚这一点。

这是表格

@using (Html.BeginForm("RegisterCompany", "Master", FormMethod.Post, new { @class = "form-horizontal" }))
        {
            <div class="panel panel-default">
                <div class="form-group">
                        <label class="col-md-3 col-xs-5 control-label">Company Name:</label>
                        <div class="col-md-9 col-xs-7">
                            @Html.TextBoxFor(x => x.Name, new { type = "text", @class = "form-control" })
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-md-3 col-xs-5 control-label">Password:</label>
                        <div class="col-md-9 col-xs-7">
                            <div class="input-group">
                                <span class="input-group-addon"><span class="fa fa-unlock-alt"></span></span>
                                @Html.PasswordFor(x => x.Password, new { type = "password", @class = "form-control" })
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-md-3 col-xs-5 control-label">Country:</label>
                        <div class="col-md-9 col-xs-7">
                            @Html.DropDownListFor(x => x.CountryId, (IEnumerable<SelectListItem>)ViewBag.CountryItems, "Please Select", new { @class = "form-control select", @onchange = "CallChangefunc(null)" })
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-md-3 col-xs-5 control-label">Province:</label>
                        <div class="col-md-9 col-xs-7">
                            @Html.DropDownListFor(x => x.ProvinceId, (IEnumerable<SelectListItem>)ViewBag.ProvinceItems, "Please Select", new { @class = "form-control select", @onchange = "CallChangefunc(this.value)" })
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-md-3 col-xs-5 control-label">City:</label>
                        <div class="col-md-9 col-xs-7">
                            @Html.DropDownListFor(x => x.CityId, (IEnumerable<SelectListItem>)ViewBag.CityItems, "Please Select", new { @class = "form-control select" })
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-md-3 col-xs-5 control-label">Are you a supplier:</label>
                        <div class="col-md-9 col-xs-7">
                            @Html.CheckBoxFor(x => x.IsSupplier, new { type = "checkbox", @class = "icheckbox" })
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-md-3 col-xs-5 control-label">Company Logo:</label>
                        <div class="col-md-9 col-xs-7">
                            <input type="file" class="fileinput btn-primary" name="filename" id="filename" title="Browse file" />
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-md-12 col-xs-5">
                            <button class="btn btn-primary btn-rounded pull-left">Back</button>
                            <button class="btn btn-primary btn-rounded pull-right">Register</button>
                        </div>
                    </div>
                </div>
            </div>
        }
    </div>
</div>
<script type="text/javascript" src="../../Scripts/js/plugins.js"></script>
<script type="text/javascript" src="../../Scripts/js/plugins/jquery/jquery.min.js"></script>
<script type="text/javascript" src="../../Scripts/js/plugins/jquery/jquery-ui.min.js"></script>
<script type="text/javascript" src="../../Scripts/js/plugins/bootstrap/bootstrap.min.js"></script>
<script type="text/javascript" src="../../Scripts/js/plugins/mcustomscrollbar/jquery.mCustomScrollbar.min.js"></script>
<script type='text/javascript' src='../../Scripts/js/plugins/icheck/icheck.min.js'></script>
<script type="text/javascript" src="../../Scripts/js/plugins/bootstrap/bootstrap-file-input.js"></script>
<script type="text/javascript" src="../../Scripts/js/plugins/bootstrap/bootstrap-datepicker.js"></script>
<script type="text/javascript" src="../../Scripts/js/plugins/bootstrap/bootstrap-select.js"></script>
<script type="text/javascript" src="../../Scripts/js/plugins/tagsinput/jquery.tagsinput.min.js"></script>
<script type="text/javascript" src="../../Scripts/js/settings.js"></script>
<script type="text/javascript" src="../../Scripts/js/plugins.js"></script>
<script type="text/javascript" src="../../Scripts/js/actions.js"></script>
<script type='text/javascript' src='../../js/plugins/noty/jquery.noty.js'></script>
<script type='text/javascript' src='../../js/plugins/noty/layouts/topCenter.js'></script>
<script type='text/javascript' src='../../js/plugins/noty/layouts/topLeft.js'></script>
<script type='text/javascript' src='../../js/plugins/noty/layouts/topRight.js'></script>
<script type='text/javascript' src='../../js/plugins/noty/themes/default.js'></script>
<script>
    function CallChangefunc(provinceId) {
        var countries = document.getElementById("CountryId");
        var countryId = countries.options[countries.selectedIndex].value;
        window.location.href = "/Master/SetDropDowns?provinceId=" + provinceId + "&countryId=" + countryId;
    }
</script>

这是操作结果

[HttpGet]
    public ActionResult SetDropDowns(string provinceId, string countryId)
    {
        if(TempData["RegisterVM"] == null)
            TempData["RegisterVM"] = new RegisterVM();

        var registerVM = TempData["RegisterVM"] as RegisterVM;

        if (!string.IsNullOrEmpty(provinceId) && provinceId != "null")
            registerVM.ProvinceId = Convert.ToInt32(provinceId);
        if (!string.IsNullOrEmpty(countryId) && countryId != "null")
            registerVM.CountryId = Convert.ToInt32(countryId);

        IEnumerable<SelectListItem> CountryItems = BusinessAPI.CountryManager.GetAllCountries().Select(ci => new SelectListItem
        {
            Value = ci.Id.ToString(),
            Text = ci.Name
        });

        ViewBag.CountryItems = CountryItems;

        IEnumerable<SelectListItem> ProvinceItems = BusinessAPI.ProvinceManager.GetAllProvincesByCountryId(registerVM.CountryId).Select(ci => new SelectListItem
        {
            Value = ci.Id.ToString(),
            Text = ci.Name
        });

        ViewBag.ProvinceItems = ProvinceItems;

        IEnumerable<SelectListItem> CityItems = BusinessAPI.CityManager.GetAllCitiesByProvinceId(registerVM.ProvinceId).Select(ci => new SelectListItem
        {
            Value = ci.Id.ToString(),
            Text = ci.Name
        });

        ViewBag.CityItems = CityItems;

        return View("Register");
    }

【问题讨论】:

    标签: javascript c# model-view-controller


    【解决方案1】:

    这是因为window.location.href 会再次发送一个新的请求来获取页面。 它对填充的数据没有任何想法。

    所以尝试使用 ajax 来填充您的下拉列表。

    【讨论】:

      【解决方案2】:

      简单的解决方案是不要在下拉更改事件中回发整个表单,而是进行 ajax 调用并获取国家/地区,即 json 格式的 Id 和 Name。在成功回调中将它们绑定在下拉列表中。

      您可以按照以下链接轻松访问:

      Populate dropdownlistfor by ajax call

      如果您遇到任何问题,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 2017-11-20
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多