不将视图模型发送回控制器的低调Ajax调用
我的cshtml详细信息视图中有这段代码。我想将VM发送回此控制器方法。这是因为我可以在控制器中设置断点,但是模型为空。这是客户端不将视图模型发送回控制器的低调Ajax调用,ajax,jquery,asp.net-mvc-3,asp.net-ajax,Ajax,Jquery,Asp.net Mvc 3,Asp.net Ajax,我的cshtml详细信息视图中有这段代码。我想将VM发送回此控制器方法。这是因为我可以在控制器中设置断点,但是模型为空。这是客户端 function downLoadFile() { $.ajax({ url: '/Software/DownLoadInstall', type: "POST", data: JSON.stringify('@Model'), datatype: "json", conten
function downLoadFile() {
$.ajax({
url: '/Software/DownLoadInstall',
type: "POST",
data: JSON.stringify('@Model'),
datatype: "json",
contentType: "application/json; charset=utf-8"
});
}
这是我的控制器的外观
[HttpPost]
public ActionResult DownLoadInstall(SoftwareEditViewModel vm)
{
try
{
SoftwareService.DownLoadInstall(vm);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
调用
@Model
只需对对象调用ToString()
您需要首先将模型
转换为json
示例扩展方法
public static class JsonHelperExtensions
{
static readonly JavaScriptSerializer Serializer = new JavaScriptSerializer();
public static string ToJson(this object o)
{
return Serializer.Serialize(o);
}
}
然后在jQuery函数中:
function downLoadFile() {
$.ajax({
url: '/Software/DownLoadInstall',
type: "POST",
data: JSON.stringify('@Model.ToJson()'),
datatype: "json",
contentType: "application/json; charset=utf-8"
});
}
调用
@Model
只需对对象调用ToString()
您需要首先将模型
转换为json
示例扩展方法
public static class JsonHelperExtensions
{
static readonly JavaScriptSerializer Serializer = new JavaScriptSerializer();
public static string ToJson(this object o)
{
return Serializer.Serialize(o);
}
}
然后在jQuery函数中:
function downLoadFile() {
$.ajax({
url: '/Software/DownLoadInstall',
type: "POST",
data: JSON.stringify('@Model.ToJson()'),
datatype: "json",
contentType: "application/json; charset=utf-8"
});
}
我认为一个复杂的模型不太可能产生JSON.stringify可以使用的合理的字符串表示。您最好只传递要下载的项目的id(可能包含在模型中)。如果下载意味着我所想的,它真的应该返回一个FileResult,并且你不应该在之后重定向。也没有必要使用AJAX,因为文件下载不会让您离开页面。我根据你的名字做了一些大的假设——如果我错了,你真的应该用更好的名字
[HttpPost]
public ActionResult DownLoadInstall(int id)
{
return SoftwareService.DownLoadInstall( ModelFromID(id) );
}
private SoftwareViewModel ModelFromID( id )
{
... populate the model needed for download from id ...
}
客户
function downLoadFile() {
location.href = '/software/downloadinstall/' + @Model.ID;
}
我认为一个复杂的模型不太可能产生JSON.stringify可以使用的合理的字符串表示。您最好只传递要下载的项目的id(可能包含在模型中)。如果下载意味着我所想的,它真的应该返回一个FileResult,并且你不应该在之后重定向。也没有必要使用AJAX,因为文件下载不会让您离开页面。我根据你的名字做了一些大的假设——如果我错了,你真的应该用更好的名字
[HttpPost]
public ActionResult DownLoadInstall(int id)
{
return SoftwareService.DownLoadInstall( ModelFromID(id) );
}
private SoftwareViewModel ModelFromID( id )
{
... populate the model needed for download from id ...
}
客户
function downLoadFile() {
location.href = '/software/downloadinstall/' + @Model.ID;
}
tvanfosson thx…你的目的是对的。我们公司有30个dc,每个国家都有自己的本地驱动器,用于下载软件。因此,我必须在退出后使用Response.WriteFile将文件流式传输回来,并进行“网络使用”以从正确的logonserver下载文件。我不认为我不需要使用Ajax。我有两个按钮和详细信息页面…他们可以下载并查看帮助文件,也可以下载实际安装。对不起,如果我收到这张小纸条。谢谢你的回复。直到你提到FileResult,我才知道。这看起来像是一条路要走…我在传统的ASPX模式下构建了这个应用程序的原型,现在在MVC3中重做了它…这是一个巨大的帮助感谢你的参考…这里是一个伟大的关于它的tvanfosson thx的文章…关于这个目的,你已经做对了。我们公司有30个dc,每个国家都有自己的本地驱动器,用于下载软件。因此,我必须在退出后使用Response.WriteFile将文件流式传输回来,并进行“网络使用”以从正确的logonserver下载文件。我不认为我不需要使用Ajax。我有两个按钮和详细信息页面…他们可以下载并查看帮助文件,也可以下载实际安装。对不起,如果我收到这张小纸条。谢谢你的回复。直到你提到FileResult,我才知道。这看起来像是一条路要走…我在传统的ASPX模式下构建了这个应用程序的原型,现在已经在MVC3中重做了它…这是一个巨大的帮助,感谢您的参考…这里是一篇关于它的精彩文章