1

ViewModel から入力されたユーザーのリストを表示するビューがあります。

    function MyUser(data) {
     this.Id = ko.observable(data.Id);
     this.phone = ko.observable(data.Phone);
     this.Company = ko.observable(data.Company);
     this.SelectedGrowerID = ko.observable(data.SelectedGrowerID);

     this.setSelectedClass = function (item, event) {
        $('#hfGrowerID').val(event.target.id);

      this.SelectedGrowerID = event.target.id;
    };
   }

    function UserListViewModel() {
    // Data
    var self = this;
    self.users = ko.observableArray([]);

    // Load initial state from server, convert it to MyUser instances, then  populate  self.users
    $.getJSON("UserList/GetAllUsers", function (allData) {
    var mappedUsers = $.map(allData, function (item) { return new MyUser(item) });
    self.users(mappedUsers);
    });

各ユーザーの会社にバインドされたリスト アイテムを含む単純なフォームがあります。さらに、各リスト項目がクリックされたときにユーザーの ID を保存する隠しフィールドがあります。

        <form action="UserList/Save" method="post">
          <ul id="UserList" data-bind="foreach: users" data-role="listview">
            <li data-bind="click: setSelectedClass"><a data-bind="attr: {id: Id}">
            <span data-bind="text: Company" /></a></li>
          </ul>

          <input id="hfGrowerID" type="hidden" />
          <input type="hidden" name="users" data-bind="value: ko.toJSON(users)" />

          <button type="submit">Save</button>
        </form>

UserListController で、隠しフィールド 'hfGrowerID' の値を取得したいと考えています。保存機能は次のようになります。

     <HttpPost()>
     Public Function Save(<FromJson()> users As IEnumerable(Of MyUserModel),
     hfGrowerID As String) As ActionResult
       'do stuff
       Return View ("Index", users)
     End Function

問題は、hfGrowerID に値がなく、Request.Form("hfGrowerID") を実行しても何も返されないことです。alert と console.log を実行して、リスト項目をクリックした後に hfGrowerID が値を取得していることを確認しました。

ViewModel の一部ではない隠しフィールドの値を取得するにはどうすればよいですか?

助けてくれてありがとう。

4

1 に答える 1

0

selectedGrowerIdViewModelに追加してみませんか?

AJAX 経由でフォームを投稿する場合、非表示のフォーム フィールドも必要ありません。

ユーザーがタグsetSelectedClassの 1 つをクリックしたときに呼び出される関数が、現在、非表示のフォーム フィールドの値を設定していると思いますか?<li>hfGrowerID

代わりに、その関数に ViewModel の値を設定させselectedGrowerId、送信ボタンを変更して、clickイベントがsubmitFormAJAX 経由で必要なデータを送信する関数にバインドされる通常のボタンにします。

更新: 質問に追加された追加コードへの応答

あなたのthis参照があなたを困らせていることは間違いありません。

MyUser関数を次のように変更してみてください。

function MyUser(data) {
    var self = this;
    self.Id = ko.observable(data.Id);
    self.phone = ko.observable(data.Phone);
    self.Company = ko.observable(data.Company);
    self.SelectedGrowerID = ko.observable(data.SelectedGrowerID);

    self.setSelectedClass = function (item, event) {
        $('#hfGrowerID').val(event.target.id);
        self.SelectedGrowerID = event.target.id;
    };
}

this単純に に置き換えたように見えますが、関数内の値と、その関数外の値、MyUser 関数内の購入の値にself違いがあると思います。thissetSelectedClassthis

于 2012-09-11T23:53:19.320 に答える