空值从 javascript 传递给控制器
Null value getting passed to controller from javascript
我检查了 SO 中的几个帖子并根据一些建议更改了我的代码,但它仍然无法正常工作。
我正在构建一个 ASP.NET 核心 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;
}
}
我不知道你为什么需要 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();
}
您需要更改参数名称以匹配路由,如下所示:
[HttpPost]
[Route("UpdateStatus/{id}")]
public void UpdateStatus(string id)
{
// Do something
}
我检查了 SO 中的几个帖子并根据一些建议更改了我的代码,但它仍然无法正常工作。
我正在构建一个 ASP.NET 核心 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;
}
}
我不知道你为什么需要 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();
}
您需要更改参数名称以匹配路由,如下所示:
[HttpPost]
[Route("UpdateStatus/{id}")]
public void UpdateStatus(string id)
{
// Do something
}