jQuery发布到控制器并重定向以查看MVC ASP.net

时间:2019-01-22 15:50:14

标签: c# jquery asp.net asp.net-mvc

我有一些复选框和一个按钮(不在表单中)

单击按钮时,我有一些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然后返回视图时,模型未通过传递,大概是因为它将模型作为查询字符串发送。

viewmodel不是简单的,它包含列表,即数字和嵌套模型。

任何人都可以通过传递视图模型的同时,以最有效的方式重定向/返回视图吗?

答案

我保留了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;
}

2 个答案:

答案 0 :(得分:1)

我可以将viewmodel服务器端持久化,也许保留在会话变量中,或者可能保留为TempData(TempData通常只保留到下一个请求),然后将会话变量的密钥传递给如果是会话变量,则是第二个控制器;如果是TempData,则直接在视图中使用TempData。这样可以避免整个对象来回传递多次。

答案 1 :(得分:0)

所以我之前做过的方式是在DOM中有一个空的div。

<div id="partialViewContent">
<!-- Content will be loaded later. -->
</div>

如果您有默认视图,则需要使用以下代码段将其设置为从URI加载。

$("#partialViewContent").load("Controller/Action",
        function (response, status) {
            if (status !== "success") {
                console.log("An error has occured when attempting to load partial view.");
            }
        });

当您通过JQUERY发布到控制器操作时,请使该操作返回模型的局部视图。 (假设模型与每个局部视图相关。)

然后,当ajax完成时,用POST响应替换partialViewContent中的内容。