2 つのアクション メソッドを順番に呼び出す必要があるフォームがあります。こんな流れです。
- まず、前提条件データがユーザーによって入力されているかどうかを確認します。そうでない場合は、ユーザーが最初にデータを入力する必要があるというメッセージを表示します。
- すべての前提データが入力されたら、データを返すアクション メソッドを呼び出します。データが返されない場合は、同じページに「データが見つかりません」というメッセージが表示されます。
- データが返された場合は、別のコントローラーにある別のアクション メソッドを呼び出します。これにより、すべてのデータを含むビューが新しいタブに返されます。
景色:
@using (Ajax.BeginForm("Index", "OrderListItems", null, new AjaxOptions { OnBegin = "verifyRequiredData"}, new { @id = "formCreateOrderListReport", @target = "_blank" }))
{
//Contains controls and a button
}
このビューのスクリプト:
function verifyRequiredData() {
if ($("#dtScheduledDate").val() == "") {
$('#dvValidationSummary').html("");
var errorMessage = "";
errorMessage = "<span>Please correct the following errors:</span><ul>";
errorMessage += "<li>Please enter Scheduled date</li>";
$('#dvValidationSummary').append(errorMessage);
$('#dvValidationSummary').removeClass('validation-summary-valid').addClass('validation-summary-errors');
return false;
}
else {
$('#dvValidationSummary').addClass('validation-summary-valid').removeClass('validation-summary-errors');
$('#dvValidationSummary').html("");
$.ajax({
type: "GET",
url: '@Url.Action("GetOrderListReport", "OrderList")',
data: {
ScheduledDate: $("#dtScheduledDate").val(),
Crews: $('#selAddCrewMembers').val(),
Priorities: $('#selPriority').val(),
ServiceTypes: $('#selServiceTypes').val(),
IsMeterInfoRequired: $('#chkPrintMeterInfo').val()
},
cache: false,
success: function (data) {
debugger;
if (data !== "No data found") {
//var newUrl = '@Url.Action("Index", "OrderListItems")';
//window.open(newUrl, '_blank');
return true;
} else {
//Show message "No data found"
return false;
}
}
});
return false;
}
}
「OrderList」コントローラの「GetOrderListReport」アクション メソッド:
public ActionResult GetOrderListReport(OrderListModel model)
{
var contract = new OrderReportDrilldownParamDataContract
{
ScheduledDate = model.ScheduledDate
//Setting other properties as well
};
var result = OrderDataModel.GetOrderList(contract);
if (string.IsNullOrWhiteSpace(result) || string.IsNullOrEmpty(result))
{
return Json("No data found", JsonRequestBehavior.AllowGet);
}
var deserializedData = SO.Core.ExtensionMethods.DeserializeObjectFromJson<OrderReportDrilldownDataContract>(result);
// send it to index method for list
TempData["DataContract"] = deserializedData;
return Json(deserializedData, JsonRequestBehavior.AllowGet);
}
OrderListItems コントローラーに存在する最後のアクション メソッド。その結果を新しいタブに表示する必要があります。
public ActionResult Index()
{
var deserializedData = TempData["DataContract"] as OrderReportDrilldownDataContract;
var model = new OrderListItemViewModel(deserializedData);
return View(model);
}
問題は、Ajax.BeginForm で @target = "_blank" を使用したにもかかわらず、このデータが新しいタブに表示されないことです。上記のように、 window.open(newUrl, '_blank') も使用しようとしました。しかし、それでも結果は新しいタブに表示されません。
どこが間違っているのか教えてください。