我正在尝试将数据从JavaScript函数发布到控制器方法中。当我有一个简单的模型时,它可以正常工作,但是当我使用包含多个对象的ViewModel尝试发布数据时,它就无法工作。 换句话说,我有一个登录页面,并从我的视图中将数据发布到登录方法中
查看:
<input type="text" name="username" >
<input type="password" name="password">
<button type="submit" id="postIt">Log in</button>
JavaScript:
$("#postIt").click(function() {
postIt();
});
function postIt() {
var usr = $("#username").val();
var pwd = $("#password").val();
$.ajax({
type: "POST",
url: "Home/Login",
data: {
"Username": usr,
"Password": pwd
},
success: function(data) {
if (data.result) {
alert(data.message);
} else {
// unauthorized
alert(data.message);
}
}
});
}
这是我的控制器
[HttpPost]
public JsonResult Login(LoginModel data)
{
//some code
}
当我使用包含用户名和密码的简单模型LoginModel
时,一切正常。但就我而言,我正在使用包含表和列表负载的ViewModel,并且当我尝试像这样在控制器中传递ViewModel时
[HttpPost]
public JsonResult Login(ViewModel data)
{
//some code
}
我的ViewModel包含
public class myViewModel
{
public LoginModel LoginModal { get; set; }
public List<Users> UsersV { get; set; }
public List<Images> ImagesV { get; set; }
public List<Videos> VideosV { get; set; }
public List<Notes> NotesV { get; set; }
///...
}
我发现数据为空,但不是在使用LoginModel
时,所以有什么办法可以使此代码正常工作?
答案 0 :(得分:0)
UPD
0),请在ViewModel(LoginModAl => LoginModEl)中更正您的命名
1)放上这个
public JsonResult Login([FromBody]ViewModel data)
请选中此binding
<input type="text" name="username" id="username" >
<input type="password" name="password" id="password">
3)然后,您需要添加contentType和Json.stringify:
$.ajax({
type: "POST",
url: "Home/Login",
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
"loginModel":{
"Username": usr,
"Password": pwd
}
}),
控制器中的
我希望这次会有所帮助
答案 1 :(得分:0)
将数据发布到MVC中时,您需要将属性与要发布的参数进行匹配。
在您的JavaScript中,您正在发布一个如下所示的对象:
{
"Username": usr,
"Password": pwd
}
但是您的视图模型期望像这样:
{
"LoginModal": {
"Username": usr,
"Password": pwd
}
}
解决此问题的一种方法是修改javascript:
function postIt() {
var usr = $("#username").val();
var pwd = $("#password").val();
$.ajax({
type: "POST",
url: "Home/Login",
data: {
"LoginModal": {
"Username": usr,
"Password": pwd
}
},
success: function(data) {
if (data.result) {
alert(data.message);
} else {
// unauthorized
alert(data.message);
}
}
});
}
但是,我不建议这样做。您正在尝试对视图模型进行过多的处理,应该考虑将它们分成单独的ViewModels
和Views