我在asp.net MVC編程新的,請溫柔... :)重定向到局部視圖,另一個控制器
請注意以下幾點看法都是局部視圖!通過Ajax調用方法並通過列表重定向到部分視圖,通過Ajax發佈表單,等等。好吧,我們繼續...
第一個控制器名爲AlertsController。其中一種方法是ResolveAlert(Guid id),它返回RedirectToAction - > UnresolvedAlerts(),它只是一個未解決的警報列表。
第2個控制器名爲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");
}
...這是我爲CustomerDetails()方法對我FrontDeskController:
// 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>
我想爲了讓返回的部分在其容器內正確呈現,我應該從ResolveAlert()方法返回一個RedirectToAction,但問題在於它屬於不同的控制器...
是否有可能以某種方式得到這個工作,或者我應該咬緊牙關,忘記將這些頁面作爲partial,擺脫Ajax調用並使用普通的Url.Action()鏈接?