簡體   English   中英

ASP.net MVC控制器將不會返回視圖

[英]ASP.net MVC Controller will not return view

還是對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; }
}

我假設您確實要在進行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調用之后重定向。

在我看來,就像您使用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,如果服務器上發生異常,您應該可以使用這些工具進行更詳細的檢查。

在ajax調用之后執行HTTP重定向可能沒有多大意義。 您可以使用html表單和常規POST來簡單地做到這一點。

但是,如果您確實需要重定向,但仍希望通過AJAX進行POST,則可以通過返回Json而不是重定向來做到這一點,如以下答案所示:

在這種情況下,您可以返回Json對象內的目標操作url,並在成功處理程序中使用該信息,如Neil的答案所示。

另外,請記住RedirectToAction只是302重定向,因此,它不會直接呈現視圖,因此您不會將其傳遞給成熟的ViewModel,只是傳遞給瀏覽器向其發出GET的Action Url。

該目標GET操作應遵循POST-REDIRECT-GET模式 ,負責獲取已安裝的應用程序信息並將其作為參數傳遞給視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM