【发布时间】:2014-09-04 12:43:12
【问题描述】:
我正在尝试更新我的模型而不刷新页面。我正在使用我页面上许多地方的所见即所得内联编辑器。编辑器可以放置在页面的任何位置,它可能看起来像这样:
<div id="1" class="click2edit">@Model.Header</div>
<div id="2" class="click2edit">@Model.Content</div>
每个编辑器div 都有一个保存按钮,可以转到这个 jquery,下面的 ajax。
它的作用是:当我点击保存按钮时,例如<div id="1" class="click2edit">@Model.Header</div>
它发布 div 的 id 及其内容(在本例中为 @Model.Header)。还有我的整个@model
$('.click2edit').click(function () {
var modelDataJson = '@Html.Raw(Json.Encode(Model))';
$(this).note({ focus: true });
var activeId = (this.id);
activeId = activeId.replace(/ /g, '');
$(this).note({
oninit: function () {
$('#saveFileBtn').click(function (event) {
$('#previewBtn').click(),
$.ajax({
url: '/Home/SaveContent',
type: 'POST',
data: {
model: modelDataJson,
activeId: activeId,
contentToUpdate: $("div#" + activeId).html()
},
dataType: 'json',
success: function (data) {
alert("sucess");
},
error: function () {
alert("error");
}
});
$('.click2edit').destroy();
});
}
});
});
然后在我的 mvc-controller 中,它将新内容放在正确的位置并保存到我的数据库中。 这是通过将整个旧模型替换为从视图中发布的新模型来完成的:
[ValidateInput(false)]
public void SaveContent(string model, string activeId, string contentToUpdate)
{
//my logic to save to db is here...
}
问题是:
我的剃刀视图中的模型没有更新。如果我只是保存我的编辑内容之一,一切都很好。但是当我在刷新页面之前尝试保存另一个时,它没有得到更新。
那是因为我的 razor-views @model 仍然持有旧值。
所以基本上唯一更新的值是我将保存的最后一个值。
我可以在不刷新整个页面的情况下以某种方式刷新我的视图@model 吗?
编辑: 我现在改变了我的成功函数,所以它看起来像这样:
success: function (data) {
$("#1").text(data.Header);
},
但是这个模型的值没有得到更新。我从成功函数发回的数据是我作为 Json 的模型。
<div id="1" class="click2edit">@Model.Header</div>
【问题讨论】:
-
Ajax 由两部分组成:1)在没有回发的情况下更新幕后数据(你有这部分),2)更新视图以反映这些变化。真正将新的“模型”呈现为整个视图的唯一方法是将需要更改的视图部分作为完整的标记返回给您的操作(通常您不希望将 void 方法作为操作MVC)。您需要在成功函数中以任何方式更改视图(其中数据由您的操作方法提供)。
-
@xDaevax 感谢您的回答。你的意思是我需要做的是将我的 void-method 作为 ActionResult 。然后,将我的整个模型返回到我的成功函数。当它恢复成功时,我需要在那里做一些事情来更新我的内容吗?我真的不明白。
-
@xDaevax 我现在将我的方法更改为 ActoinResult 并将我的模型返回为 Json。 json 正在返回视图成功数据。如果这是一个正确的方法,那么我应该做什么来用这些值更新我的模型?
-
这取决于你需要什么。如果您只是更新模型的标头和内容属性(假设这些在
success的数据参数中返回),那么您只需要定位这些 div 并在您的成功方法中替换它们的内容:$("#1").text(data.Header);例如。 -
@xDaevax 请看我的编辑! =)
标签: jquery ajax asp.net-mvc razor