|
这是来自网友的问题:
这个问题很具有代表性,我们先来看下你的代码逻辑:
- @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 });
- }
复制代码
页面显示效果如下:
=====我是分割线===============================================================
上述代码虽然可以运行,但是下载后出现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();
- }
复制代码
运行时效果:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|