MVC控制器和MVC控制器库中的httppost函数相同,但在控制器库中发现错误



我创建了web MVC Core项目,并有两个控制器,其中主控制器是控制器,会话数据控制器是控制器数据库我在下面放置了相同的功能

[HttpPost]
public async Task<SessionInfo> GetSessionInfo(string SessionID)
{
Console.WriteLine($"Main.GetSessionInfo({SessionID})");
var getSession = await SessionService.GetSessionInfoAsync(int.Parse(SessionID));
if (getSession == null) return null;
return new()
{
returnstartdate = getSession.dtStartTime.HasValue ? getSession.dtStartTime.Value.ToString("dd/MM/yy HH:mm:ss") : string.Empty,
returnenddate = getSession.dtEndTime.HasValue ? getSession.dtEndTime.Value.ToString("dd/MM/yy HH:mm:ss") : string.Empty
};
}

查看,在Javascript中我调用下面的函数

function cbSessionChange() {

var url = '@Url.Action("GetSessionInfo", "SessionData")'; 
var selectvalue = $("#cbSessionList").val(); // Confirm have value
console.log(`cbSessionList.val : ` + selectvalue.toString())
$.post(url, { SessionID :selectvalue.toString()},
function (data) {
$('#txtDateFr').val(data.returnstartdate);
$('#txtDateTo').val(data.returnenddate);
}
,'json')
};

如果我在Controller中调用GetSessionInfo(SessionID(是工作的,但是,当在ControllerBase中调用GetSession Info(SessionID(时,我会得到null参数值。不过,我试着用poster来测试一下这两个功能都能正常工作。

我能知道里面有什么错吗?

谢谢

$.post方法默认内容类型为application/x-www-url-formencoded

如果ControllerBase使用[ApiController]属性进行声明,则会导致模型绑定系统默认绑定来自body的数据(内容类型为application/json(。

为了满足您的要求,ControllerBase中的特定[FromForm]属性:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpPost]
public async Task<SessionInfo> GetSessionInfo([FromForm]string SessionID)
{
//...
}
}

或者只删除[ApiController]:

[Route("api/[controller]")]
//[ApiController]
public class ValuesController : ControllerBase
{
[HttpPost]
public async Task<SessionInfo> GetSessionInfo(string SessionID)
{
//...
}
}

更新:

如果您想通过ajax发布application/json数据,请更改如下:

<script>
function cbSessionChange() {
var url = '@Url.Action("GetSessionInfo", "SessionData")';
var selectvalue = 1; // Confirm have value
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: url,
data: JSON.stringify(selectvalue.toString()),   //add this..
dataType: "json",
success: function (result, status, xhr) {
$('#txtDateFr').val(result.returnstartdate);
$('#txtDateTo').val(result.returnenddate);
},
error: function (xhr, status, error) {
alert("Result: " + status + " " + error + " " + xhr.status + " " + xhr.statusText)
}
});
}

控制器:

public class SessionDataController : Controller
{
[HttpPost]
public async Task<SessionInfo>  GetSessionInfo([FromBody] string SessionID)
{
//...
}
}

最新更新