Asp mvc jquery - 就地编辑

时间:2011-11-12 11:51:13

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

我有一些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条评论。点击编辑我得到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>

4 个答案:

答案 0 :(得分:4)

首先像这样将一个itemid添加到div中,并将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);
    }

答案 1 :(得分:2)

Marc的答案是正确的。用这个代码包围你的代码。但是我强烈建议你在html中制作“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很可能会变得无法管理。

答案 2 :(得分:1)

您必须在textarea周围添加form标记,并通过@ Url.Action帮助程序将表单的操作设置为所需的操作。

答案 3 :(得分:0)

您需要对控制器操作进行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");
    }
});