我有一些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>
答案 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调用。请参考以下链接:
你会在那里找到一个样本。
基本上,您需要做的事情如下:
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");
}
});