我试图创建一个"克隆"页面上的数据。总结是我有一个创建客户工作屏幕和一个单独的管理客户工作屏幕。这些都很好。我需要"克隆"已有的客户工作数据,以创建一组新的类似工作。所以在我的管理屏幕上,我有一个克隆按钮。我想让这个转到我的"创建"具有预先填充有原始数据的数据的页面,减去一个或两个相关的识别信息,例如,工作名称。
我的问题是我似乎无法使用视图模型中的新数据将帖子重定向到“创建”页面。我无法提交操作,因为这会保存数据;我克隆的数据不会在管理和创建屏幕之间保留。
我在这里:
在我的CSHTML中:
<button type="button" name="btnClone" value="btnClone" id="btnClone" formaction="CloneJob" class="btn btn-primary" style="width: 150px;">Clone</button>
这会触发click事件以获取当前jobId,然后触发此函数:
function CloneJob(jobId) {
$.post('CloneJob', { JobId: jobId }, function (data) {
window.document(data);
});
}
在我的控制器中,我有这个:
[HttpPost]
public ActionResult CloneJob(Guid jobId) {
// logic which wipes off the old data job from the view model
// eg names, ids, etc. but leaves the actual job details intact
return View("CreateJob", manageJobViewModel);
从这里,我可以看到在IE / Chrome调试网络部分中返回的HTML,但它不会进入我填充数据的CreateJob视图。
我错过了什么?
答案 0 :(得分:1)
首先,如果您要替换整个选项卡/窗口内容,请不要使用AJAX。没有意义,这只是需要额外维护的东西。相反,使用标准链接。其次,只有在某些事情发生变化时才应该进行POST。这里应该只是一个简单的GET请求。
创建指向“创建”网址的链接,并为正在克隆的作业传递ID。然后,在create操作中,您可以从数据库中查找该作业,根据该ID,使用数据填充视图模型,并将其与视图一起返回。
如果你想要一个按钮的外观,你可以设置链接的样式看起来像一个按钮,但你应该使用标准的旧<a>
标签,因为这是语义含义。
答案 1 :(得分:0)
我已经设法进一步发展它现在“有效”。我的控制器没有改变,但我的javascript现在是:
$.when($.get('CloneJob', {jobId: jobId}))
.then(function (response)
{ $("body").html(response); });
我知道这仍然是ajax,但面对技术上可接受的替代方案,这确实有效。我很乐意采取任何更先进技术的方法,因为我知道这有点滥用ajax。
答案 2 :(得分:0)
我设法破获了这个。
我的cshtml现在包含以下代码:
@Html.ActionLink("Clone Job", "CloneJob", null, new { @class = "btn btn-default", @style = "width: 150px" })
我的控制器只是从会话中获取当前的视图模型并使用它来克隆作业。然后,控制器现在只返回我在方法中设置的新模型的视图。
return View("CreateJob", clonedJobViewModel);
当我看到它时,现在很简单,但它已经到了那里。