【问题标题】:Asp mvc jquery - in place editAsp mvc jquery - 就地编辑
【发布时间】:2011-11-12 11:51:12
【问题描述】:

我有一个包含一些数据的 div 列表:

<div style="border: 1px solid #dddddd;">        
        <div id="wrap">
        <h3  id="cText">@Model.CommentText</h3>   
        <a id="runEdit" href="#" >Edit</a> 
        </div>
</div>

当用户点击 runEdit 链接时,我会从这里进行编辑:

e.preventDefault();

        var txt = $('#cText').text();

        $('#cText').remove();

        $('#wrap').prepend('<textarea>' + txt + '</textarea>');
        $('#wrap').append('<input type="submit" value="Ok" />');
        $('#wrap').append('<input type="submit" value="Cancel" />');

问题是我在 javascript 中添加了这两个按钮。但我不知道如何将一些控制器操作附加到此按钮?

这里的问题是,如果我写 5 cmets。然后点击编辑我得到 5 个编辑表单。

$('#editButton').live('click', function (e) {
        e.preventDefault();

        var container = $(this).closest('.commentWrap');
        var itemId = container.attr('id');

        var nestId = '#' + itemId;

        var txt = $('#commentTextValue').text();

        $(nestId + ' #commentTextValue').remove();
        $(nestId + ' #editButton').remove();
        $(nestId).prepend('<textarea id="editArea">' + txt + '</textarea>');
        $(nestId).append('<input type="submit" value="Ok" class="btnOk" />');
    })


    $('.btnOk').live('click', function (e) {
        e.preventDefault();
        var container = $(this).closest('.commentWrap');
        var itemId = container.attr('id');
        var text = container.find('textarea').val();

        var nestId = '#' + itemId;
        //alert(nestId);

        $.ajax({
            url: '/Comment/SaveComment',
            data: JSON.stringify({ CommentText: text, CommentId: itemId }),
            type: 'post',
            contentType: 'application/json',
            success: function (data) {
                if (data.success === true) {
                    //alert(data.message); // do show/hide stuff here instead of the alert
                    $(nestId + ' #editArea').remove();
                    $(nestId + ' .btnOk').remove();
                    $(nestId).append('<h3 id="commentTextValue">' + data.message + '</h3>');
                    $(nestId).append('<a id="editButton" href="#">Edit</a>');

                }
            }
        });

    });


</script>

    <div style="border: 1px solid #dddddd;">
        @Html.ActionLink(@Model.Author, "SomeAction")
        <div class="commentWrap" id="@Model.CommentId">
            <p id="commentTextValue">@Model.CommentText</p>
            <a id="editButton" href="#">Edit</a>
        </div>
    </div>

【问题讨论】:

    标签: javascript jquery asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    首先像这样向 div 添加一个 itemid,然后将 id=wrap 转换为一个类,因为它们不止一个。

    <div class="wrap" id="123"></div>
    

    这样您就可以引用正在编辑的项目的 id。

    您还应该在页面上注入的提交按钮中添加一个类,fx:

    <input type="submit" class="btnOk" value="Ok"/>
    

    然后你就可以连接javascript了:

    $('.btnOk').live('click',function(e){
       e.preventDefault();
       var container = $(this).closest('.wrap');
       var itemId = container.attr('id');
       var text = container.find('textarea')[0].val();
       $.ajax({
         url: '/mycontroller/savecomment',
         data: JSON.stringify({comment: text, id:itemId}), // using JSON2, see below
         type: 'post',
         contentType: 'application/json',
         success: function(data){
           if(data.success===true){
              alert(data.message); // do show/hide stuff here instead of the alert
    
            }
         }
       });
    
    }); 
    

    注意:下载 json2 库并将其添加到您的脚本引用中 - 这是进行 json 序列化的好方法。 (https://github.com/douglascrockford/JSON-js)

    在您的控制器中,您必须添加一个操作方法来处理请求:

        public ActionResult SaveComment(string text, int id)
        {
            //save your comment for the thing with that id
            var result = new {success = true, message = "saved ok"};
            return Json(result, JsonRequestBehavior.AllowGet);
        }
    

    【讨论】:

      【解决方案2】:

      马克的回答是正确的。用这个包围你的代码。但是,我强烈建议您尽可能多地使用“html in html”而不是 JavaScript。

      上面的代码可以翻译成更好的形状,像这样,

      <div style="border: 1px solid #dddddd;">        
          <div id="wrap">
          <h3  id="cText">@Model.CommentText</h3>   
          <a id="runEdit" href="#" >Edit</a> 
          </div>
          <div id="editPanel" style="display:none;">
              <form action="@Url("Edit", "Whatevercontroller")">
                  <textarea name="CommentText">@CommentText</textarea>
                  <input type="submit" value="Ok" />
                  <a href="#" id="cancelEdit">Cancel</a>
              </form>
          </div>
      </div>
      

      js 会是

      function StartEdit() {
          $("#wrap").css("display", "none");
          $("#editPanel").css("display", "block");
      }
      function CancelEdit() {
          $("#wrap").css("display", "block");
          $("#editPanel").css("display", "none");
      }
      

      这种方法的优点是在这种情况下不会生成过多的 DOM 元素。否则,您的 JavaScript 可能会变得完全无法管理。

      【讨论】:

        【解决方案3】:

        您必须在您的文本区域周围放置一个form 标记,并通过@Url.Action 助手将表单的操作设置为所需的操作。

        【讨论】:

        • 你的意思是在 javascript 中为表单编写代码,例如:$('#wrap').prepend('Html.BeginForm...{ ');}
        【解决方案4】:

        您需要对控制器操作进行 Ajax 调用。请参考以下链接:

        http://tugberkugurlu.com/archive/working-with-jquery-ajax-api-on-asp-net-mvc-3-0-power-of-json-jquery-and-asp-net-mvc-partial-views

        你会在那里找到一个样本。

        基本上,你需要做的事情如下:

        var d = "poo=1&bar=2";
        
        $.ajax({
            type: "POST",
            url: "/home/myaction",
            data: d,
            success: function (r) {
                alert(r.data);
            },
            complete: function () {
        
                alert("I am done!");
            },
            error: function (req, status, error) {
                //do what you need to do here if an error occurs
                alert("error");
            }
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-21
          • 1970-01-01
          • 2013-03-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多