ASP.NET 核心传递数据从 AJAX 到 View

ASP.NET Core pass data from AJAX to View

我是 ASP.NET 的新手,我正在尝试通过 AJAX 将 JSON 对象传递到可以修改该对象的视图。我有一个带有单击事件的按钮,该按钮使用 POST 方法将数据发送到 Action 方法,该方法将字符串反序列化为一个对象,并将该对象重定向到另一个呈现视图的 Action 方法。 AJAX success 函数成功完成,我可以在开发人员工具的网络选项卡中看到视图,但在 UI 中按钮似乎什么也没做。我不熟悉 ASP.NET 中的路由,想知道我的 Controller 中是否存在路由问题。

AJAX

function myFunc(){
     
    $("#myTable").unbind().on('click','.stageBtn',function(){
     // get the current row
     var currentRow = $(this).closest("tr")[0]; 
     var cells = currentRow.cells;

    var dataObject = JSON.stringify({
    'serial': cells[2].textContent,
    'sku': cells[3].textContent,
    'make': cells[0].textContent,
    'model': cells[1].textContent,
    'quantity': cells[4].textContent,
    'description': cells[5].textContent,
    'location': cells[6].textContent,

        });

        $.ajax({
    type: "POST",
    url: 'Home/Stage',
    contentType: 'application/json',
    data: JSON.stringify(dataObject),
    success:function() {
       alert("Success");
    },
    error: function () {
        alert("Fail");
    }
});
   
     event.stopPropagation? event.stopPropagation() : event.cancelBubble = true;
     return false;
    });
   
    return false;
 }

控制器

[HttpPost]
        public IActionResult Stage([FromBody]string p) {

            Product product = Newtonsoft.Json.JsonConvert.DeserializeObject<Product>(p);
            if (!ModelState.IsValid)
            {
                return BadRequest("Enter required fields.");
            }
            else {
                return RedirectToAction("Detail",product.ToStaging());
            }
           
        }

       
        public IActionResult Detail(Staging s)
        {
            return View(s);
        }

请求 URL 的格式为:localhost/Home/Detail?{serial}&{sku}&{make}&{model}&{quantity}&{description}

好的,所以您正在使用 AJAX,它用于更新页面的一部分而不重新加载整个页面,或者根据您从服务器返回的结果进行重定向。

现在,您正试图从 Controller 本身重定向,这是不正确的,因为那不是 AJAX 的工作方式。您需要从您的 AJAX 调用向您 View 发回结果,然后进行重定向

对于你的情况,你可以这样做:

您需要 return 从您的 Controller 中获得 JSON 结果。现在,由于您还想发送 Model,您可以将其存储在 Session 变量中,并在从 AJAX 调用重定向后访问它:

[HttpPost]
public IActionResult Stage([FromBody]string p) 
{

    Product product = Newtonsoft.Json.JsonConvert.DeserializeObject<Product>(p);
    if (!ModelState.IsValid)
    {
         return Json(new {status="false", msg= "Enter required fields."});
    }
    else {
        Session["myModel"] = product.ToStaging();
        return Json(new {status="true", msg= "Redirect now"});
    }      
}

您的 AJAX 电话将是:

$.ajax({
    type: "POST",
    //url: 'Home/Stage',
    url: '@Url.Action("Stage", "Home")',
    contentType: 'application/json',
    data: JSON.stringify(dataObject),
    success:function(data) {
      if(data.status=="true")
      {
        var urlToRedirect= '@Url.Action("Detail","Home")';
        window.location.href = urlToRedirect; //Redirect here
      }
      else
      {
        alert(data.msg)
      }
    },
    error: function () {
        alert("Fail");
    }
});

并且您可以像这样在 Detail 方法中检索 Model

public IActionResult Detail()
{
   Staging myModel = new Staging();
   if(Session["myModel"] != null)
   {
      //Cast your session variable as required
      myModel  = (Staging)(Session["myModel"]);
   }
   return View(myModel);
}