FineUI 官方论坛
标题:
【经验分享】FineUIMvc中使用F.doPostBack条件下载时出错
[打印本页]
作者:
sanshi
时间:
2019-1-21 10:40
标题:
【经验分享】FineUIMvc中使用F.doPostBack条件下载时出错
这是来自网友的问题:
[attach]11820[/attach]
这个问题很具有代表性,我们先来看下你的代码逻辑:
@section body {
@(F.Panel()
.ID("Panel1")
.ShowBorder(false)
.ShowHeader(false)
.BodyPadding(5)
.Layout(LayoutType.VBox)
.IsViewPort(true)
.Toolbars(
F.Toolbar()
.ID("Toolbar1")
.Items(
F.Button()
.ID("btnDownload")
.Icon(Icon.PackageDown)
.Text("判断下载")
.Listener("click", "onDownloadClick"),
F.Button()
.ID("btnDownload")
.Icon(Icon.PackageDown)
.Text("直接下载")
.Listener("click", "downloadFile"),
F.Button()
.ID("btnClose")
.Icon(Icon.Cancel)
.Text("关闭")
.Listener("click", "parent.removeActiveTab();")
)
)
.Items(
F.TextBox()
.ID("txtContent1")
.ShowLabel(false)
.Text("内容一"),
F.TextBox()
.ID("txtContent2")
.ShowLabel(false)
.Text("内容二"),
F.Label()
.Text("F12,点“判断下载”会显示一个错误 =》 Uncaught SyntaxError: Unexpected token :at new Function (<anonymous>) ...")
)
)
<!-- 隐藏表单,用于自定义POST请求 -->
@using (Html.BeginForm("DownloadFile", "Download", FormMethod.Post, new { id = "myform" }))
{
@Html.AntiForgeryToken()
<input type="hidden" name="hidContent1" />
<input type="hidden" name="hidContent2" />
}
}
@section script {
<script type="text/javascript">
//判断是否满足下载条件
function onDownloadClick(event) {
F.doPostBack({
url: '@Url.Action("btnDownload_Click")',
fields: 'Panel1',
params: { },
enableAjaxLoading: false
});
}
//下载文件
function downloadFile() {
//自定义POST请求
var myform = $('#myform');
myform.find('[name=hidContent1]').val(txtContent1);
myform.find('[name=hidContent2]').val(txtContent2);
myform[0].submit();
}
</script>
}
复制代码
后台代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult btnDownload_Click(FormCollection fc)
{
bool success = false;
if(!string.IsNullOrEmpty(fc["txtContent1"]) ||!string.IsNullOrEmpty(fc["txtContent2"]))
{
success = true;
}
return Json(new { result = success });
}
复制代码
页面显示效果如下:
[attach]11821[/attach]
=====我是分割线===============================================================
上述代码虽然可以运行,但是下载后出现JS错误。这里有个关键的地方被忽略了:
F.doPostBack 回发时,后台 必须返回 UIHelper.Result() !
因为 F.doPostBack 是由 FineUIMvc 自行托管的函数,所以使用这一函数必须要遵守这一约定。还要理解的是,UIHelper.Result() 返回到前台的是一段JavaScript 代码,而不是文本或者JSON字符串。
修改后的代码如下:
//判断是否满足下载条件
function onDownloadClick(event) {
F.doPostBack({
url: '@Url.Action("btnDownload_Click")',
fields: 'Panel1',
params: { },
enableAjaxLoading: false
});
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult btnDownload_Click(FormCollection fc)
{
bool success = false;
if(!string.IsNullOrEmpty(fc["txtContent1"]) ||!string.IsNullOrEmpty(fc["txtContent2"]))
{
success = true;
}
//return Json(new { result = success });
if (success)
{
PageContext.RegisterStartupScript("downloadFile();");
}
else
{
PageContext.RegisterStartupScript("F.alert('没有满足下载的文件!');");
}
return UIHelper.Result();
}
复制代码
运行时效果:
[attach]11826[/attach]
[attach]11827[/attach]
欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/)
Powered by Discuz! X3.4