用JavaScript/敲除下拉列表中的选定值填充MVC3视图模型?

用JavaScript/敲除下拉列表中的选定值填充MVC3视图模型?,javascript,ajax,asp.net-mvc-3,viewmodel,knockout.js,Javascript,Ajax,Asp.net Mvc 3,Viewmodel,Knockout.js,我正在寻找有关如何在检索列表并在下拉列表中选择项目后填充传递给视图的viewmodel的建议。注意,我还有一个用于Ajax/Knockout客户端代码的客户端视图模型,但这不是我试图填充的视图模型。我可能必须从一个视图模型映射到另一个视图模型,但我不确定这是否是正确的解决方案 视图-窗体 在我的表单中,我使用Knockout和JavaScript作为下拉列表。如何使用所选的县代码值填充视图模型m.VMResidentityWCS.ScCountyCd字段?是否也可以捕获描述?如果是这样的话,又该

我正在寻找有关如何在检索列表并在下拉列表中选择项目后填充传递给视图的viewmodel的建议。注意,我还有一个用于Ajax/Knockout客户端代码的客户端视图模型,但这不是我试图填充的视图模型。我可能必须从一个视图模型映射到另一个视图模型,但我不确定这是否是正确的解决方案

视图-窗体

在我的表单中,我使用Knockout和JavaScript作为下拉列表。如何使用所选的县代码值填充视图模型m.VMResidentityWCS.ScCountyCd字段?是否也可以捕获描述?如果是这样的话,又该如何做呢

@model Apps.Model.ViewModels.AVMApplicationInfo
...
@using (Html.BeginForm("ApplicationDetails", "PersonalInfo"))
{
    <fieldset>
        <div class="appl-step">
      ...
            <div class="editor-label">
                <span class="error">*</span>@Html.LabelFor(m => m.VMResidencyWTCS.ScCountyCd) 
            </div>
            <div class="editor-field">
                <select id='counties' 
                        data-bind='
                            options: selectedResidencyState() ? counties : null, 
                            optionsValue : "CountyCd", 
                            optionsText: "CountyDescr", 
                            optionsCaption: "[Please select a county]", 
                            value: selectedCounty,
                            visible: (counties() && counties().length > 0 )'>
                </select>
                <span data-bind='
                    template: {name: "noInfoTemplate"},
                    visible: !(counties() && counties().length > 0)'>
                </span>
            </div>
请注意,我还有一个客户端viewmodel,用于 Ajax/Knockout客户端代码,但这不是我现在使用的视图模型 正在尝试填充。我可能需要从一个视图模型映射到另一个视图模型 但我不确定这是否是正确的解决方案

好的,有一些黄旗正在升起

让我重申一下您的问题以验证我的理解:您有一个视图模型,其中一个可观察绑定到一个框。让我们假设这是vm1.0

您有一个第二视图模型,并且希望将vm1.mySelection存储在vm2.mySelection中

对吗

如果是这样,我的第一个想法是,你可能做错了。请解释为什么你认为你需要这个,我们会告诉你是否有更好的方法


其次,如果确实需要,可以在vm2内手动订阅vm1.mySelection,然后在vm2中相应地设置值。但同样,这让人感觉很粗糙,你可能做错了。

我的设计可能不是最好的。我有一个从服务器传递到视图的视图模型,如视图语句@model Apps.model.ViewModels.AVMApplicationInfo中定义的。我在视图表单中广泛使用它来捕获信息以构建web服务调用

我需要添加一些级联下拉列表来获得过滤信息。为此,我添加了淘汰代码和客户端视图模型var-residentityviewmodel=new-residentity;ko.applyBindingsresidencyViewModel。这用于通过ajax回调控制器以获取下拉值。选择下拉列表值后,我希望将选择存储在Apps.Model.ViewModels.AVMApplicationInfo视图模型中。我不确定是否需要clientside视图模型,但我不确定如何编写此代码

所选值还将作为另一个筛选值用于后续级联下拉列表。某些下拉列表使用表单中先前选择的多个下拉列表中的选定值;i、 例如,他们有多个过滤器,例如:国家、州、县、市。这是由于无法更改的表结构造成的。但最终,当完成所有选择后,必须使用所有选择填充Apps.Model.ViewModels.AVMApplicationInfo视图模型,以便将值传递回服务器以进行web服务调用


这有意义吗

我对你的问题有点困惑。你是在问如何将县代码放入一个可观察的淘汰视图模型吗?
<script type='text/javascript'>
    $(document).ready(function () {
    var residency = function () {
        this.selectedResidencyState = ko.observable();
        this.selectedCounty = ko.observable();
                    ...
        this.states = ko.observableArray();
        this.counties = ko.observableArray();
     ...

        this.selectedResidencyState.subscribe(function (stateCd) {
            this.selectedCounty(undefined);
            this.counties(undefined);

            if (stateCd != null) {
                $.ajax({
                    url: '@Url.Action( "GetCounties", "PersonalInfo")',
                    data: { stateCd: stateCd },
                    type: 'GET',
                    success: function (data) {
                        residencyViewModel.counties(data);
                    }
                });
            }
        } .bind(this));

    };

    var residencyViewModel = new residency();
    ko.applyBindings(residencyViewModel);

    //Load the states
    $.ajax({
        url: '@Url.Action( "GetResidencyStates", "PersonalInfo" )',
        type: 'GET',
        success: function (data) {
            residencyViewModel.states(data);
        }
    });
});
</script>
public class PersonalInfoController : Controller
{
…
    [HttpGet]
    public virtual ActionResult GetCounties(string stateCd)
    {
        var counties =
            (
                from county in this._countyRepository.All
                where (county.CountryCd == "USA" && county.ResidencyStateCd == stateCd)
                select new
                {
                    CountyCd = county.CountyCd,
                    CountyDescr = county.CountyDescr,
                    StateCd = county.ResidencyStateCd,
                    CountryCd = county.CountryCd // Added for populating model ?Needed?
                }
            ).ToList();

        return Json(counties, JsonRequestBehavior.AllowGet);
    }