2012-09-11 26 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