【问题标题】:how to pass id of selected dropdown in knockout function如何在淘汰功能中传递选定下拉列表的ID
【发布时间】:2015-12-18 13:15:06
【问题描述】:

这是我在淘汰赛中的简单功能。 在最后一行你可以看到,data: ko.toJson(post)

    self.addPost = function () {
    var post = new Post();
    post.Message(self.newMessage());
    return $.ajax({
        url: postApiUrl,
        dataType: "json",
        contentType: "application/json",
        cache: false,
        type: 'POST',
        data: ko.toJSON(post)
    })
    .done(function (result) {
       self.posts.splice(0, 0, new Post(result));
       self.newMessage('');
   })
   .fail(function () {
       error('unable to add post');
   });
}

现在,除此之外,我想通过下拉选择的 id 像这样

data: { id: $("#Locations").val() }

现在,请告诉我如何将这两者合二为一,以便我可以将消息连同选定的下拉 ID 一起发布到控制器中。这是我的控制器:

   public JsonResult PostPost(Post post, int? id)
    {
        post.PostedBy = User.Identity.GetUserId<int>();
        post.NeighbourhoodId = id;        
            db.Posts.Add(post);
            db.SaveChanges();
            var usr = db.Users.FirstOrDefault(x => x.Id == post.PostedBy);
            var ret = new
            {
                Message = post.Message,
                PostedBy = post.PostedBy,
                NeighbourhoodId = post.NeighbourhoodId
            };
        return Json( ret,JsonRequestBehavior.AllowGet);   
    }

在我的视图页面上,这是我触发 addPost 函数的点击事件的按钮

 <input type="button" data-url="/Wall/SavePost" value="Share" data-bind="click: addPost">

除此之外,发送 id 的下拉菜单如下所示:

 @Html.DropDownList("Locations", ViewBag.NeighbourhoodId as SelectList, "Select a location", )
          <script type="text/javascript">
             $(document).ready(function () {
              $("#Locations").change(function ()
                  {
                    var locationSelected = $("#Locations").val();
                    var url = '@Url.Action("PostPost", "Post")';
                    $.post(url, { id: locationSelected },
                   function (data) 
                            {
                               });
                            });
                          });
      </script> 

在这个视图页面,我怀疑:

1> 在按钮单击时,我正在调用 addPost 函数并成功绑定 textarea 消息。但是,现在,在下拉选择中,我是否应该像这样调用相同的 addPost 函数:

 @Html.DropDownList("Locations", ViewBag.NeighbourhoodId as SelectList, "Select a location", new { data_bind = "event: { change: addPost}" })

我只想保存所选下拉列表的 ID,以便在单击输入类型按钮时与文本区域中的消息一起发送到控制器。我删除了一些代码以减少问题的长度。请帮帮我。

【问题讨论】:

    标签: javascript jquery asp.net-mvc knockout.js


    【解决方案1】:

    这应该可以解决您的第一个问题:

    self.addPost = function () {
        var post = new Post();
        post.Message(self.newMessage());
        return $.ajax({
            url: postApiUrl,
            dataType: "json",
            contentType: "application/json",
            cache: false,
            type: 'POST',
            data: { post: ko.toJSON(post), id: $("#Locations").val() }
    });
    

    关于您的第二个问题,您不应该在每次用户更改下拉列表的值时发布控制器。在我看来,我没有任何意义。所以,去掉#Locations的“更改”功能:

     $("#Locations").change(function () {
        var locationSelected = $("#Locations").val();
        var url = '@Url.Action("PostPost", "Post")';
        $.post(url, { id: locationSelected }, function (data) {
        });
     });
    

    希望对你有帮助!

    【讨论】:

    • 感谢您的回复,但如果我在 textarea 中写入仍然会出现问题,并且一旦我选择下拉菜单,它就会击中控制器,并且 id 已保存到数据库中,消息 col 为 null。我希望两者都被保存。prob 很明显,因为我没有按下输入按钮,所以当时 post 参数为空。
    • 如我所说,去掉#Locations的“更改功能”。
    • 正如你所说我已经这样做了 $("#btnShare").click(function () { with this
    • 您说“一旦我选择下拉菜单,它就会击中控制器”——这不应该发生。只有提交按钮才能发布您的表单
    • data: { post: ko.toJSON(post), id: $("#Locations").val() } 我认为问题出在这条线,如果我使用它,那么消息为空并且如果我使用原始的,则 id 被保存为 null @Fabio Luz
    猜你喜欢
    • 2014-08-11
    • 2013-02-14
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多