Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 尝试将数据加载到新视图中_Javascript_Jquery_Asp.net_Asp.net Mvc - Fatal编程技术网

Javascript 尝试将数据加载到新视图中

Javascript 尝试将数据加载到新视图中,javascript,jquery,asp.net,asp.net-mvc,Javascript,Jquery,Asp.net,Asp.net Mvc,我在尝试在页面上创建数据的“克隆”时遇到问题。总结是,我有一个创建客户作业屏幕和一个单独的管理客户作业屏幕。这两个都很好用。我需要“克隆”已有的客户作业数据,以创建一组新的类似作业。因此,在我的管理屏幕中,我有一个克隆按钮。我想让它转到我的“创建”页面,其中的数据预先填充了原始数据,减去一两条相关的识别信息,例如工作名称 我的问题是,我似乎无法让帖子重定向到视图模型中包含新数据的创建页面。我无法进行提交操作,因为这会保存数据;我要克隆的数据不会在“管理”和“创建”屏幕之间持久化 这就是我现在的处

我在尝试在页面上创建数据的“克隆”时遇到问题。总结是,我有一个创建客户作业屏幕和一个单独的管理客户作业屏幕。这两个都很好用。我需要“克隆”已有的客户作业数据,以创建一组新的类似作业。因此,在我的管理屏幕中,我有一个克隆按钮。我想让它转到我的“创建”页面,其中的数据预先填充了原始数据,减去一两条相关的识别信息,例如工作名称

我的问题是,我似乎无法让帖子重定向到视图模型中包含新数据的创建页面。我无法进行提交操作,因为这会保存数据;我要克隆的数据不会在“管理”和“创建”屏幕之间持久化

这就是我现在的处境:

在我的CSHTML中:

  <button type="button" name="btnClone" value="btnClone" id="btnClone" formaction="CloneJob" class="btn btn-primary" style="width: 150px;">Clone</button>
}

在我的控制器中,我有:

[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视图


我缺少什么?

首先,如果要替换整个选项卡/窗口内容,请不要使用AJAX。这没有意义,只是需要额外的维护。而是使用标准链接。第二,只有当事情发生变化时,才应该发布帖子。这里应该只是一个简单的GET请求

创建指向“创建”URL的链接,并传递要克隆的作业的id。然后,在创建操作中,您可以根据该id从数据库中查找该作业,用数据填充视图模型,并将其与视图一起返回


如果你想要一个按钮的外观,你可以把链接设计成一个按钮,但是你应该使用一个标准的
标签,因为这就是这里的语义

我已经设法在这方面做得更进一步了,它现在“起作用了”。我的控制器不变,但我的javascript现在是:

$.when($.get('CloneJob', {jobId: jobId}))
.then(function (response) 
{ $("body").html(response); }); 

我知道这仍然是ajax,但是面对一个技术上可以接受的替代方案,这确实有效。我很乐意接受任何关于技术上更整洁的方法的建议,因为我知道这有点滥用ajax。

我已经设法破解了这个问题

我的cshtml现在包含以下代码:

@Html.ActionLink("Clone Job", "CloneJob", null, new { @class = "btn btn-default", @style = "width: 150px" })
我的控制器只是从会话中获取当前viewmodel,并使用它克隆作业。然后,控制器现在只返回带有我在方法中设置的新模型的视图

return View("CreateJob",  clonedJobViewModel);

现在,当我看它时,它很简单,但它是实现目标的部分。

在控制器中,该评论似乎表明您希望有一个完全填充的JobViewModel,但事实并非如此。控制器不会在请求之间保留状态信息,除非您对它们进行编程以这样做。我认为您需要做的就是使用传入的jobId从数据库创建JobModelView。我只需要抓取会话视图模型,清理它,这就是我想要返回到CreateJobs屏幕的manageJobViewModel。我很高兴这个逻辑能像我调试时看到的那样工作。如果你能在“返回视图”之前在调试器中看到填充的JobViewModel,那么它应该能工作。我以前从未见过“window.document(…)”语法。我通常会选择“window.document.body.innerHtml=”,但我只会加载页面中显示在body标记中的部分。您可以使用Fiddler web调试器查看发送到浏览器的确切内容。我已经设法进一步了解它现在“工作”。我的控制器没有改变,但我的javascript现在是:$.when($.get('CloneJob',{jobId:jobId})).then(function(response){$(“body”).html(response);});我知道这仍然是ajax,但是面对一个技术上可以接受的替代方案,这确实有效。我很乐意接受任何关于技术上更整洁的方法的建议,因为我知道这有点滥用ajax。
return View("CreateJob",  clonedJobViewModel);