【问题标题】:Pass a complex object from window.open to MVC Controller将复杂对象从 window.open 传递给 MVC 控制器
【发布时间】:2020-04-23 22:04:27
【问题描述】:

我正在研究将复杂数据从 window.open() 传递到 MVC 控制器操作方法参数的 javascript 功能。 我能够通过构造一个查询字符串并从控制器中的 [FromQuery] 中检索它们来实现它。

但我的问题是我想将数据作为模型对象传递。是否可以在 window.open() 中

下面是我的javascript代码

$("#btnExportToExcelForBatch").on('click',
                function() {
                    var currentBatchId = 0;
                    var empName = $("#empName").val();
                    var empId = $("#empId").val();
                    var deptId = $("#deptId").val();
                    window.open("/Download/ExportToExcel?EmpName="
                        + empName + "&EmpId=" + empId + "&DeptId="
                        + deptId);                 
                });

如您所见,我可以在 URL 中传递数据,但它似乎暴露了。那么,有没有办法让我通过
var url = @Url.Action("ExportToExcel", "Download");

但我无法通过它们。

是否有可能通过将模型对象发送到 MVC 控制器来实现。

public async Task<IActionResult> ExportToExcel(EmployeeModel employeeModel)
{
     // SomeCode
     return File();
}

谁能帮我解决这个问题

【问题讨论】:

    标签: c# jquery model-view-controller controller


    【解决方案1】:

    好的,这里有几个选项。您可以生成查询字符串,然后将其发送到window.open,但在这种情况下您的参数将被公开:

    var urlquerstr = BaseUrl + "/Download/ExportToExcel?EmpName="+ empName + "&EmpId=" + empId+ "&DeptId="+ deptId;
    

    使用Url.Action等效:

    var urlquerstr = @Url.Action("ExportToExcel", "Download", new { EmpName= Model.empName, EmpId= Model.empId, DeptId=Model.deptId })
    

    生成查询字符串后,您可以简单地执行以下操作:

    window.open(urlquerstr);
    

    或者您正在寻找 POST 将您的参数添加到您的 Controller 方法,并在此基础上采取适当的措施。您可以使用AJAX 执行此操作。具体到您的情况:

    $("#btnExportToExcelForBatch").on('click',
       function() {
          var currentBatchId = 0;
          var empName = $("#empName").val();
          var empId = $("#empId").val();
          var deptId = $("#deptId").val();
          //Generate data to be sent to the controller
          var json= { EmpName: empName , EmpId: empId , DeptId: deptId };
    $.ajax({
        url: '@Url.Action("ExportToExcel", "Download")',
        type: 'post',
        dataType: "json",
        data: { "json": JSON.stringify(json)},
        success: function (result) {
             alert(result);
             //window.open(result);
        },
        error: function (error) {
             console.log(error)
        }
      });                
    });
    

    您的 Controller 方法如下所示:

    using System.Web.Script.Serialization;
    
    [HttpPost]    
    public async Task<IActionResult> ExportToExcel(string json)
    {
        var serializer = new JavaScriptSerializer();
        dynamic jsondata = serializer.Deserialize(json, typeof(object));
    
        //Get your variables here from AJAX call
        var EmpName= jsondata["EmpName"];
        var EmpId=jsondata["EmpId"];
        var DeptId=jsondata["DeptId"];
    
        //Do something with your variables here    
    
        return Json("File exported successfully");
    }
    

    如果你想使用带有 Javascript 参数的URL.Action

    '@Url.Action("ExportToExcel", "Download")?EmpName=' + empName + '&EmpId=' + empId '&DeptId=' + deptId;
    

    请注意,您必须在 javascript 函数中调用它。

    【讨论】:

    • 对延迟回复表示歉意。我已经使用 Url.Action() 尝试过,但是在给出对象值时,它会抛出错误 empName is not in current context
    • @Vijay 抱歉,它应该是 Model.empName,其余值类似。
    • empName,empId,deptId 不是模型属性,它们是在 JS 中创建的。所以,如果我保留@Model.empName,它会抛出错误
    • @Vijay 然后您可以使用AJAX 方法(首选),也可以按照更新的答案中所示发送参数。
    • 没试过用ajax。会尽力让你知道
    【解决方案2】:

    在访问/Download/ExportToExcel时,必须将employeeModel参数值作为json body

    问题是ExportToExcel方法必须与POST或PUSH动作一起使用才能在请求正文中传递Json参数值。

    详情请查看this answer

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多