我有一些复选框和一个按钮(不在表单中)。
当按钮被点击时,我使用jQuery创建了一个包含选中复选框的值的post模型,并将其提交给控制器。
然后,控制器创建视图模型,并希望将用户重定向到正确的视图,并将视图模型传递给视图。
jQuery:
$.ajax({
url: AppSettings.baseUrl + "BOM/getMultiBOM",
type: 'POST',
data: JSON.stringify(data)
});
控制器:
[HttpPost]
public ActionResult getMultiBOM(multiBOMPostModel multiBomsPostModel)
{
BOM bom = null;
foreach (int value in multiBomsPostModel.bomsArray)
{
bom = db.BOMs.Find(value);
}
BOMViewModel viewModel = getViewModel(bom, null);
return RedirectToAction("OpenMultiBOM", new { viewModel = viewModel, bom = bom });
}
public ActionResult OpenMultiBOM(BOMViewModel viewModel, BOM bom)
{
viewModel.projectModel = new ProjectViewModel
{
project = bom.Project
};
return View(viewModel);
}
这可能有点混乱。
我认为使用jQuery将复选框的值传递给控制器是必要的。
当我使用RedirectToAction
方法跳转到方法并返回视图时,模型没有被传递,可能是因为它将模型作为查询字符串发送。
视图模型不简单,包含列表、IEnumerable
s和嵌套模型。
有人能帮忙找到最有效的重定向/返回视图同时传递视图模型的方法吗?
答案:我保留了ajax,将我的复选框值提交到控制器。
$.ajax({
url: AppSettings.baseUrl + "BOM/getMultiBOM",
type: 'POST',
data: JSON.stringify(dataArr),
}).done(function (result) {
location.href = "/BOM/OpenMultiBOM";
});
在我的控制器中,我将提交的值分配给了一个
postModel
,然后将其存储在TempData
中。关键在于返回一个Json值,这将允许客户端重定向。 public ActionResult getMultiBOM(multiBOMPostModel multiBOMPostModel)
{
TempData["BOMs"] = multiBOMPostModel;
return Json("success");
}
然后我有另一个HttpGet
方法,该方法会在页面由Ajax结果重定向后加载,并将TempData
转换为对象。
[HttpGet]
public ActionResult OpenMultiBOM(int? BomMarkupMessage = null)
{
var bomIds = TempData["BOMs"] as multiBOMPostModel;
}
BOM
和BOMViewModel
类的结构。请注意,您无法从AJAX执行RedirectToAction
,请改用普通表单提交。 - Tetsuya Yamamoto