重定向到另一个控制器上的局部视图

时间:2017-03-16 10:15:57

标签: ajax asp.net-mvc

我是asp.net mvc编程的新手,请温柔......:)

请注意以下视图都是PARTIAL视图!通过Ajax调用方法并使用列表重定向到部分视图,通过Ajax等方式发布表单。好的,这里我们去...

第一个名为AlertsController的控制器。其中一种方法是ResolveAlert(Guid id),它返回RedirectToAction - > UnresolvedAlerts(),它只是一个未解决的警报列表。

名为FrontDeskController的第二个控制器。其中一种方法是CustomerDetails(Guid id),它列出了客户和他可能有的警报。

我希望能够"解决警报问题" (因此使用第一个控制器的方法)但返回到我之前的页面,而不是转到方法返回的重定向页面。

我在ResolveAlert()方法中添加了第二个参数,该方法列出了returnUrl字符串。我设法发送我希望它重定向到的Url,但我得到的只是部分(没有在整个页面中呈现,因为它应该)...

这是我的AlertsController上的ResolveAlert方法:

// Resolve Alert POST
    [HttpPost]
    public async Task<ActionResult> Resolve(AlertModel model, string redirectUrl)
    {
        await _AlertsService.ResolveAsync(model);
        if (!string.IsNullOrWhiteSpace(redirectUrl))
            return Redirect(redirectUrl);
        return RedirectToAction("Unresolved");
    }

...这是我的FrontDeskController上的CustomerDetails()方法:

// Display Customer Alerts
        public async Task<PartialViewResult> CustomerDetails(AttendanceModel model, Guid id)
        {
            var customer = await _CustomersService.ReadAsync(id);
            ViewData["Customer"] = await _CustomersService.ReadCustomerExtendedAsync(id);

            var alerts = await _AlertsService.ReadCustomerAlertsAsync(id);
            ViewData["Alerts"] = alerts.Where(x => x.IsResolved == false).ToList();

            return PartialView("_CustomerDetails", model);
        }

第一个控制器的ResolveAlert()方法分两步调用...第一,我从CustomerDetails视图中调用一个模态:

function resolveAlert(alertId, customerId) {

        var returnTo = '/FrontDesk/CustomerDetails/' + customerId;

        $.ajax({
            method: 'GET',
            url: '/Alerts/Resolve/' + alertId,
            data: {returnUrl : returnTo},
            dataType: 'html'
        }).then(function (html) {
            $('#dialog-container').html(html);
            showDialog();
        });
    }

...然后我的模态:

@{
    var data = Request.Params["returnUrl"];
}

@using (Ajax.BeginForm("Resolve", "Alerts", new { redirectUrl = data}, new AjaxOptions() { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "partial", OnSuccess = "hideDialog" }, new { id = "form", @class = "form-horizontal" }))
{ ..... textbox with some notes that I can post while resolving the alert ..... }

...(最后)这是我模态底部的最后一部分:

<script type="text/javascript">
    $('#form').validate({
        rules: {
            AlertNotes: {
                required: true
            }
        },
        submitHandler: function (form) {

            $.ajax({
                url: $(form).attr("action"),
                data: $(form).serialize(),
                type: $(form).attr("method")
            }).then(function (result) {
                $("#partial").html(result);
                hideDialog();
            });
        }
    });
</script>

我认为为了使返回的partial在其容器内正确呈现,我应该从ResolveAlert()方法返回RedirectToAction,但问题是它属于不同的控制器......

是否有可能以某种方式使这个工作或者我应该咬紧牙关并忘记将这些页面作为部分,摆脱Ajax调用并使用正常的Url.Action()链接?

1 个答案:

答案 0 :(得分:0)

我的代码中只是一个Javascript / Ajax错误....请忽略这个问题......

对于那些想知道的人,我有两个使用相同ID的表单。 JS以静默方式死亡,允许表单正常发布而不是通过Ajax发布。它让我挠了一会儿。太糟糕了,Web开发工具和VS特别能够狙击这些错误并提供有意义的提示来帮助您进行调试......