空值从 javascript 传递给控制器

Posted

技术标签:

【中文标题】空值从 javascript 传递给控制器【英文标题】:Null value getting passed to controller from javascript 【发布时间】:2021-06-23 12:55:36 【问题描述】:

我检查了 SO 中的几个帖子,并根据一些建议更改了我的代码,但它仍然无法正常工作。

我正在构建一个 ASP.NET Core MVC 应用程序。执行时,视图会显示带有 ID 的行列表。每行都有一个对应的按钮,需要传递按钮被点击的行的ID。

在视图中,我调用了一个 JS 函数,如下所示:

            <tr>
                <td>
                    <input type="submit" id="btnSubmit" value="Update Status" class="ids" data-id="@sheet.ID" onClick="sendId(@sheet.ID)" />
                </td>
            </tr>

JS函数如下:

    function sendId(id) 
        var rowId = parseInt(id);
        $.ajax(
            url: '/UpdateStatus/' + rowId,
            type: 'POST',
            contentType: 'application/json',
            dataType: 'json',
            success: function()  alert('Success'); ,
            error: function()  alert('Error'); 
       );
       

点击按钮时会触发控制器动作方法,但也会触发上述javascript代码的错误函数,并将null传递给动作方法。

        [HttpPost]
        [Route("UpdateStatus/id")]
        public void UpdateStatus(string mID)
        
            // Do something
        

** 已编辑 **

按需发布完整的控制器代码。

   public class HomeController : Controller
    
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        
            _logger = logger;
        

     
        [Route("~/UpdateStatus/id")]
        public void UpdateStatus([FromQuery] string mID)
        
            // Do Something
        

        [HttpGet]
        [Route("Index")]
        public ActionResult Index()
        
            //TemplateData template = new TemplateData();
            List<TemplateData> templateList = new List<TemplateData>();
            templateList = ImportExcel();
            return View(templateList.AsEnumerable());
        

        public IActionResult Privacy()
        
            return View();
        

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        
            return View(new ErrorViewModel  RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier );
        

        private List<TemplateData> ImportExcel()
        
            // Read Excel
            // path to your excel file
            string path = "C:\\ExcelData\\Results.xlsx";
            FileInfo fileInfo = new FileInfo(path);

            ExcelPackage package = new ExcelPackage(fileInfo);
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            ExcelWorksheet ws = package.Workbook.Worksheets["Data"];

            List<TemplateData> templateList = new List<TemplateData>();
 

            // get number of rows and columns in the sheet
            int rowCount = ws.Dimension.Rows; // 20
            int ColCount = ws.Dimension.Columns; // 7

            // loop through the worksheet rows and columns
            for (int row = 2; row <= rowCount; row++)
            
                TemplateData template = new TemplateData();
                template.ID = ws.Cells[row, 1].Value.ToString();

                if (ws.Cells[row,6].Value != null)
                
                    template.EmpName = ws.Cells[row, 6].Value.ToString();
                

                if (ws.Cells[row, 7].Value != null)
                
                    template.WareHouse= ws.Cells[row, 7].Value.ToString();
                

                if (ws.Cells[row, 12].Value != null)
                
                    template.Observation = ws.Cells[row, 12].Value.ToString();
                

                templateList.Add(template);
            

            return templateList;
        

    

【问题讨论】:

您可以使用error: function( jqXHR, textStatus, errorThrown) console.log(jqXHR.responseText);打印出错误信息。您还可以使用浏览器调试工具来检查服务器的响应。目前,您尚未向我们展示该错误是什么,因此我们无法诊断。 我看到你的控制器函数正在返回void。这可能是一个问题,因为您没有将任何内容发送回 ajax。如果UpdateStatus 工作正常,请尝试发回 200 响应,如果UpdateStatus 无法正常执行,则尝试发送 400(错误的请求数据)或 500(服务器在写入数据库时​​遇到问题等)响应。 【参考方案1】:

我不知道你为什么需要 ajax,但如果你仍然需要它,你必须从按钮中删除 type="submit"

<td>
 <input id="btnSubmit" value="Update Status" class="ids" onClick="sendId(@sheet.ID)" />
</td>

修复你的 ajax


    $.ajax(
        url: '/UpdateStatus/' + id,
        type: 'GET',
       success: function()  alert('Success'); ,
        error: function()  alert('Error'); 
   );

并从操作中删除 Post 并修复路线

[Route("~/UpdateStatus/id")]
public IActionResult UpdateStatus(string id)

    // Do something
    return Ok();

【讨论】:

仍然传递NULL 你能发布整个控制器吗? 请立即查看。 @RKh 删除 [FromQuery] 请。这不在我的答案中 @RKh 如果您根据我的回答更改所有内容,并且您的 Id 不为空或 null,您将在操作中获得 Id 值。你不应该混淆答案【参考方案2】:

您需要更改参数的名称以匹配路由,如下所示:

[HttpPost]
[Route("UpdateStatus/id")]
public void UpdateStatus(string id)

    // Do something

【讨论】:

试过了。这也行不通。顺便说一句,我在上面添加了完整的控制器代码。 @RKh 您仍然需要修复参数的名称。您在路由中有 idmID 作为参数变量名称。它们必须相同。 哦。不知道那个。让我试试。 谢谢谢谢。有效。但我不能将两个答案标记为答案。其他用户的 JS 更改也有效。给你重击。 @RKh 再看一遍,[FromQuery] 应该不是必需的。所以可能只是导致问题的参数名称。我已经编辑了我的答案以反映这一点。

以上是关于空值从 javascript 传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 JavaScript 数组传递给 IEnumerable 会给出空值

如何将值从javascript变量传递给剃刀变量?

将可空值从 Activity 传递到 Fragment

选择时将值从 TabBarController 传递给子视图控制器

将按钮值从视图传递给控制器​​(codeigniter)

将值从代码隐藏传递给 js