对ASP.net来说还是个新手,我有这个奇怪的问题.这是一个非常基本的场景,但有些东西已经出现,我无法弄明白.部署应返回名为Deploy的视图,该视图将键入到模型CompiledAppModel中.但是,当您在视图中单击“安装”时,尽管调用了返回的View()方法,它仍然不会离开页面.有任何想法吗?
这是我的控制器:
[HttpPost] public ActionResult Deploy(string key_name,string custom_folder = "") { string userId = Membership.GetUser().ProviderUserKey.ToString(); UserDataModel user_info = _user_data_service.getUserDataByPrimaryIDNoDB(userId,HttpContext.Cache); log.Trace("Deploy was called. key_name:" + key_name + " UID: " + user_info.UID); // first we'll call the info to install remote application bool serviceInstall = _fms_app_service.DeployFmsApp(user_info,key_name,custom_folder); // then we'll call to generate client side info bool clientInstall = _fms_app_service.CompileClientApp(user_info,key_name); var model = _fms_app_service.getInstalledAppInfo(user_info,key_name); if (serviceInstall && clientInstall) { return RedirectToAction("Deploy",model); } return View("Error"); }
和我的观点:
@model IEnumerable<Models.Applications.FmsAppModel> @foreach (var item in Model) { <div class="col"> <h2>@Html.DisplayFor(modelItem => item.friendly_name)</h2> <p>@Html.DisplayFor(modelItem => item.app_description)</p> <p><strong>Tags:</strong> @Html.DisplayFor(modelItem => item.app_type)</p> <a href="#" class="btn btn-primary install-app" data-key-name="@(item.key_name)">Install</a> @Html.ActionLink("Details","Detailss",new { id=item.app_id }) </div> } </div> <script type="text/javascript"> (function () { $('.install-app').on('click',function (e) { e.preventDefault(); var data_key_name = $(this).data('key-name'); //ajax install app $.ajax({ type: "POST",url: '@Url.Action("Deploy")',data: { key_name: data_key_name } }); }); })(); </script>
和模型.
public class CompiledAppModel { [Display(Name = "Admin URL")] public string adminURL { get; set; } [Display(Name = "Viewer URL")] public string viewerURL { get; set; } [Display(Name = "Embed URL")] public string embedURL { get; set; } }
解决方法
我假设你真的想在进行ajax调用后重定向.
据我所知,你必须实现一个自定义ActionResult,如:
public class AjaxAwareRedirectResult : RedirectResult { public AjaxAwareRedirectResult(String url) : base(url) { } public override void ExecuteResult(ControllerContext context) { if ( context.RequestContext.HttpContext.Request.IsAjaxRequest() ) { String destinationUrl = UrlHelper.GenerateContentUrl(Url,context.HttpContext); JavaScriptResult result = new JavaScriptResult() { Script = "window.location='" + destinationUrl + "';" }; result.ExecuteResult(context); } else { base.ExecuteResult(context); } } }
在你的控制器中,只需:
[HttpPost] public ActionResult Deploy(string key_name,HttpContext.Cache); log.Trace("Deploy was called. key_name:" + key_name + " UID: " + user_info.UID); // first we'll call the info to install remote application bool serviceInstall = _fms_app_service.DeployFmsApp(user_info,custom_folder); // then we'll call to generate client side info bool clientInstall = _fms_app_service.CompileClientApp(user_info,model); } return AjaxAwareRedirectResult("/foo"); }