ASP.net MVC控制器无法返回视图。

8

我还是ASP.net的新手,遇到了一个奇怪的问题。这是一个非常基本的场景,但是出了点问题,我无法解决。Deploy应该返回一个名为Deploy的视图,类型为CompiledAppModel模型。然而,当您在视图中点击安装时,尽管调用了return 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; }
}
3个回答

5

我假设您在进行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, 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 AjaxAwareRedirectResult("/foo");
}

但是,正如我所说的,这只是我假设您确实想在ajax调用后进行重定向。

1

看起来你正在使用Ajax调用将数据发送回服务器,这种情况下结果不会被渲染到页面上,除非进行一些额外的工作。你可以在Ajax调用中定义一个成功处理程序,在Ajax调用返回时执行操作。所以大概是这样:

<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
            },
            success: function(data) { alert(data) }
        });
    });
})();

当请求完成时,将通过警报消息向您返回来自ajax调用的HTML。

如果服务器上发生异常,我还会使用Firebug或Chrome中的开发人员工具查看返回的HTML,您应该能够使用这些工具更详细地检查异常。


1

在ajax调用之后进行HTTP重定向可能没有太多意义。您可以使用HTML表单和常规POST来完成此操作。

但是,如果您确实需要重定向并仍希望通过AJAX进行POST,则可以通过返回Json而不是重定向来实现,如以下答案所建议的那样:

在这种情况下,您可以在Json对象中返回目标操作url,并在成功处理程序中使用Neil答案中显示的信息。
另外,请记住,RedirectToAction只是一个302重定向,因此它不会直接呈现视图,因此您不需要传递完整的ViewModel,只需将Action Url传递给浏览器发出GET请求。
该目标GET操作应该负责获取已安装的应用程序信息并将其作为参数传递给视图,遵循POST-REDIRECT-GET模式

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接