2011-12-14 7 views
1

リストが取得された後にビューに渡されたビューモデルとドロップダウンリストで選択された項目を取り込む方法に関するアドバイスを探しています。クライアント側のビューモデルもAjax/Knockoutクライアントコードに使用されていますが、これは表示しようとしているビューモデルではありません。あるビューモデルから別のビューモデルにマップする必要があるかもしれませんが、それが正しい解決策であるかどうかはわかりません。MVC3ビューモデルにJavaScript/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); 
    } 
+0

私は少しあなたの質問に混乱しています。郡のコードをノックアウトビューモデルにする方法を尋ねていますか? – Tyrsius

答えて

0

私も のAjax /ノックアウトクライアントコードで使用されるクライアント側のviewmodelを持っていますが、これは私が 午前ビューモデルではありません注意移入しようとしています。あるビューモデルから別のビューモデルにマップする必要があるかもしれませんが、それが正しい解決策であるかどうかはわかりません。

[OK]をクリックすると、黄色のフラグが表示されます。

私は理解を確認するためにあなたの質問を再度お聞かせください。あなたは< >ボックスにオブザーバブルがバインドされたビューモデルを持っています。それがvm1.mySelectionのふりをしましょう。

2番目のビューモデルがあり、vm2.mySelection内にvm1.mySelectionを保存する必要があります。

これは間違いありませんか?

もしそうなら、私の最初の考えは、「あなたはおそらくそれを間違っている」ということです。なぜあなたはこれが必要だと思っているのかを説明し、より良い方法があるかどうかを教えてください。

第2に、本当にこれが必要な場合は、vm2内のvm1.mySelectionに手動でサブスクライブし、それに応じてvm2に値を設定することができます。しかし、再び、これはハッキングしていると感じ、あなたはそれを間違っているかもしれません。

0

私のデザインがベストではないかもしれません。ビューステートメント(@model Apps.Model.ViewModels.AVMApplicationInfo)で定義されているように、ビューモデルがサーバーからビューに渡されています。私はこれをWebサービスコールを構築するための情報を取得するために "フォーム"というビューで広く使用します。

フィルタリングされた情報を取得するためにいくつかのカスケードドロップダウンを追加する必要がありました。これを行うために、ノックアウトコードとクライアント側ビューモデルを追加しました(var residencyViewModel =新しいレジデント(); ko.applyBindings(residencyViewModel);)。これは、ajax経由でコントローラにコールバックしてドロップダウン値を取得するために使用されます。ドロップダウン値が選択されたら、Apps.Model.ViewModels.AVMApplicationInfoビューモデルに選択項目を保存したいと思います。私はクライアント側のビューモデルが必要かどうかはわかりませんが、これをどのようにコード化するかはわかりません。

次のカスケードドロップダウン(別のフィルタ値として)にも選択された値が使用されます。一部のドロップダウンでは、フォームの前の方で選択した複数のドロップダウンから選択した値を使用します。すなわち、それらは、国、州、郡、自治体などの複数のフィルタを有する。これは変更できないテーブル構造によるものです。結局のところ、すべての選択が行われたときに、Apps.Model.ViewModels.AVMApplicationInfoビューモデルには、Webサービス呼び出しのために値をサーバーに戻すためにすべての選択が行われなければなりません。

それは意味がありますか?

関連する問題