2012-09-11 29 views
1

我有一個視圖顯示從ViewModel填充的用戶列表。asp.net mvc3,knockout.js表單提交到服務器

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

我有一個簡單的形式,列表項綁定到每個用戶的公司。此外,我有一個隱藏字段,當每個listitem被點擊時,我保存了用戶的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的隱藏字段的值?

非常感謝您的幫助。

回答

0

爲什麼不將selectedGrowerId添加到您的ViewModel?

如果您通過AJAX發佈表單,您甚至不需要隱藏表單字段!

我猜setSelectedClass函數是當用戶點擊您的<li>標記之一時調用的函數,當前正在設置hfGrowerID隱藏表單字段的值?

相反,有一個功能設置的selectedGrowerId值在你的視圖模型,並更改提交按鈕,這是一個正常的按鈕,其click事件被綁定到submitForm功能通過AJAX職位所需要的數據。

UPDATE:應對額外的代碼加入到質疑

我敢打賭,你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; 
    }; 
} 

即使它看起來像我簡單地更換thisself,我相信有在thissetSelectedClass函數中的含義不同,相比於在該函數的外部值this,在MyUser函數內購買。

+0

是的,你是對的。我試圖按照你的路徑,但仍然沒有獲得服務器端的價值。編輯初始文章顯示我正在做什麼來保存SelectedGrowerID。我錯過了什麼? – WhatsInAName