【问题标题】:jQuery post to controller and redirect to ASP.NET MVC viewjQuery 发布到控制器并重定向到 ASP.NET MVC 视图
【发布时间】:2019-01-22 15:50:14
【问题描述】:

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

单击按钮时,我有一些 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 时,模型没有被传递,大概是因为它正在将模型作为查询字符串发送。

视图模型并不简单,它包含列表、IEnumerables 和嵌套模型。

任何人都可以在传递视图模型时提供最有效的重定向/返回视图的方法吗?

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

【问题讨论】:

  • 请同时显示BOMBOMViewModel 类结构。请注意,您不能从 AJAX 执行 RedirectToAction,请改用普通表单提交。
  • 我在我的问题中使用了这个!

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


【解决方案1】:

我会坚持viewmodel 服务器端,可能在会话变量中,或者可能作为TempData(TempData 通常只存在到下一个请求),并将会话变量的密钥传递给第二个控制器会话变量的情况,或者在 TempData 的情况下直接在您的视图中使用 TempData。这样可以避免多次来回传递整个对象。

【讨论】:

  • 我使用了 TempData,但在重定向浏览器时遇到问题。因为初始请求是使用 jquery 发出的,所以结果是视图被返回,但浏览器没有被重定向到正确的页面。有什么建议吗?
  • 是的 - 我认为您必须从控制器传回重定向 url 或类似参数,在 jQuery ajax 中捕获成功响应,并在 javascript 中手动重定向。见:stackoverflow.com/questions/19762629/…
【解决方案2】:

所以我之前这样做的方法是在 DOM 中有一个空的 div。

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

如果您有默认视图,则需要使用以下 sn-p 将其设置为从 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 完成后,将 partialViewContent 中的内容替换为 POST 响应。

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多