Заполнение модели представления MVC3 выбранным значением из раскрывающегося списка JavaScript / Knockout? - PullRequest
1 голос
/ 14 декабря 2011

Я ищу совет о том, как заполнить модель представления, переданную в представление после получения списка и выбора элемента в раскрывающемся списке. Обратите внимание, что у меня также есть клиентская модель представления, которая используется для клиентского кода Ajax / Knockout, но это не модель представления, которую я пытаюсь заполнить. Возможно, мне придется отобразить одну модель представления в другую, но я не уверен, что это правильное решение.

Вид - Форма

В своей форме я использую Knockout и JavaScript для своих выпадающих меню. Как я могу заполнить поле m.VMResidencyWTCS.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>

Просмотр - JavaScript

Это мой сценарий для обратного вызова контроллера для выпадающего списка округа. Обратите внимание, что раскрывающийся список округов заполняется, когда в другом раскрывающемся списке выбирается штат.

<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);
    }

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

Мой дизайн может быть не лучшим.У меня есть модель представления, передаваемая представлению с сервера, как определено в операторе представления (@model Apps.Model.ViewModels.AVMApplicationInfo).Я широко использую это в представлении «форма» для сбора информации для создания вызова веб-службы.

Мне нужно было добавить несколько каскадных выпадающих меню, чтобы получить отфильтрованную информацию.Для этого я добавил код выхода и модель представления клиента (var residencyViewModel = new residency (); ko.applyBindings (residencyViewModel);).Это используется для обратного вызова контроллера через ajax для получения выпадающих значений.После того, как выбранное значение выбрано, я хотел бы сохранить выбор в модели вида Apps.Model.ViewModels.AVMApplicationInfo.Я не уверен, нужна ли мне модель представления на стороне клиента, но я не уверен, как еще можно это кодировать.

Выбранное значение также будет использоваться для последующих каскадных выпадающих меню (как другое значение фильтра).Некоторые раскрывающиеся списки используют выбранные значения из нескольких раскрывающихся списков, выбранных ранее в форме;то есть они имеют более одного фильтра, такого как: страна, штат, округ, муниципалитет.Это связано с тем, что структура таблицы не может быть изменена.В конечном счете, хотя, когда все выборы сделаны, модель представления Apps.Model.ViewModels.AVMApplicationInfo должна быть заполнена всеми вариантами выбора, чтобы передать значения обратно на сервер для вызова веб-службы.

Имеет ли это смысл?

0 голосов
/ 15 декабря 2011

Обратите внимание, что у меня также есть клиентская модель представления, которая используется для Код клиента Ajax / Knockout, но это не та модель представления, которой я являюсь пытаясь заселить. Возможно, мне придется сопоставить одну модель просмотра с другой но я не уверен, что это правильное решение.

Хорошо, есть несколько желтых флагов.

Позвольте мне повторить ваш вопрос, чтобы проверить мое понимание: у вас есть модель представления с видимой привязкой к блоку

У вас есть модель второго вида, и вы хотите сохранить vm1.mySelection внутри vm2.mySelection.

Это правильно?

Если так, моя первая мысль: «Вы, вероятно, делаете это неправильно». Пожалуйста, объясните, почему вы думаете, что вам это нужно, и мы скажем, есть ли лучший способ.

Во-вторых, если вам это действительно нужно, вы можете вручную подписаться на vm1.mySelection внутри vm2, а затем установить соответствующее значение в vm2. Но опять же, это кажется хакерским, и вы, возможно, делаете это неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...