Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从KnockoutJS发送到MVC控制器的POST为空_C#_Asp.net Mvc_Post_Knockout.js - Fatal编程技术网

C# 从KnockoutJS发送到MVC控制器的POST为空

C# 从KnockoutJS发送到MVC控制器的POST为空,c#,asp.net-mvc,post,knockout.js,C#,Asp.net Mvc,Post,Knockout.js,看起来这件事已经谈得不可开交了,但我似乎仍然无法让我的代码正常工作 我试图使用Knockoutjs的可编辑表,并使用一个AJAX帖子向控制器添加到模型中。但是,post在控制器中始终为空 模型如下: using System.ComponentModel.DataAnnotations; using System.Data.Entity; namespace Adder_Web.Models { public class User { [Display(Name

看起来这件事已经谈得不可开交了,但我似乎仍然无法让我的代码正常工作

我试图使用Knockoutjs的可编辑表,并使用一个AJAX帖子向控制器添加到模型中。但是,post在控制器中始终为空

模型如下:

using System.ComponentModel.DataAnnotations;
using System.Data.Entity;

namespace Adder_Web.Models
{
    public class User
    {
        [Display(Name = "ID")]
        [Required]
        [StringLength(9, ErrorMessage = "SSO must be 9 numbers", MinimumLength = 9)]
        public virtual string ID { get; set; }

        [Display(Name = "First Name")]
        [Required]
        public string FirstName { get; set; }

        [Display(Name = "Last Name")]
        [Required]
        public string LastName { get; set; }

    }

    public class UserContext : DbContext
    {
        public DbSet<User> Users { get; set; }
    }


}
使用System.ComponentModel.DataAnnotations;
使用System.Data.Entity;
名称空间加法器\u Web.Models
{
公共类用户
{
[显示(Name=“ID”)]
[必需]
[StringLength(9,ErrorMessage=“SSO必须是9个数字”,MinimumLength=9)]
公共虚拟字符串ID{get;set;}
[显示(Name=“First Name”)]
[必需]
公共字符串名{get;set;}
[显示(Name=“Last Name”)]
[必需]
公共字符串LastName{get;set;}
}
公共类UserContext:DbContext
{
公共数据库集用户{get;set;}
}
}
这是我试图发布到的控制器。发布到以下位置时,用户为空:

 [HttpPost]
    public async Task<ActionResult> CreateMultiple(IEnumerable<User> users)
    {
        if (ModelState.IsValid)
        {
            foreach (User oneUser in users)

            {
                db.Users.Add(oneUser);
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }

        }

        return View(users);
    }
[HttpPost]
公共异步任务CreateMultiple(IEnumerable用户)
{
if(ModelState.IsValid)
{
foreach(用户中的用户oneUser)
{
db.Users.Add(一个用户);
等待db.saveChangesSync();
返回操作(“索引”);
}
}
返回视图(用户);
}
下面是javascript:

    script>
    var UserModel = function (users) {
        var self = this;
        self.users = ko.observableArray(users);

        self.addUser = function () {
            self.users.push({
                id: "",
                firstName: "",
                lastName: ""
            });
        };

        self.removeUser = function (user) {
            self.users.remove(user);
        };

        self.save = function (form) {

            sendData = JSON.stringify(self.users);

            $.ajax({
                url: '/Users/CreateMultiple',
                contentType: "string",
                async: true,
                type: "POST",
                data: JSON.stringify(sendData),
                error: function (jqXHR, textStatus, errorThrown) {
                    console.log("FAIL: " + errorThrown);
                },
                success: function (data, textStatus, jqXHR) {
                    console.log("SUCCES");
                }
            });


        };
    };

    var viewModel = new UserModel([
        { id: "123456789", firstName: "John", lastName: "Doe" }
    ]);
    ko.applyBindings(viewModel);

    // Activate jQuery Validation
    $("form").validate({ submitHandler: viewModel.save });
</script>
script>
var UserModel=函数(用户){
var self=这个;
self.users=ko.observearray(用户);
self.addUser=函数(){
self.users.push({
id:“”,
名字:“,
姓氏:“
});
};
self.removeUser=函数(用户){
self.users.remove(用户);
};
self.save=函数(形式){
sendData=JSON.stringify(self.users);
$.ajax({
url:“/Users/CreateMultiple”,
contentType:“字符串”,
async:true,
类型:“POST”,
数据:JSON.stringify(sendData),
错误:函数(jqXHR、textStatus、errorshown){
console.log(“FAIL:+errorboorn”);
},
成功:函数(数据、文本状态、jqXHR){
控制台日志(“成功”);
}
});
};
};
var viewModel=新用户模型([
{id:“123456789”,姓:“约翰”,姓:“多伊”}
]);
应用绑定(视图模型);
//激活jQuery验证
$(“表单”).validate({submitHandler:viewModel.save});
Javascript部分:

  • 发送数据字符串化两次
  • 您必须设置正确的内容类型(
    application/json
C部分:

在控制器中,您必须通知您的方法模型来自http post请求的主体

public async Task<IActionResult> CreateMultiple([FromBody] IEnumerable<User> users)
{ 
    /*..*/ 
}
公共异步任务CreateMultiple([FromBody]IEnumerable用户)
{ 
/*..*/ 
}

你能试着删除Content Type和stringfy吗?我希望它能起作用,如果你的ajax方法是用一个对象发布的,你不必把[FromBody]属性放进去。可以像下面这样使用此属性

[HttpPost]
public async Task<IActionResult> CreateMultiple([FromBody] string userCode){

}
[HttpGet]
public async Task<IActionResult> CreateMultiple(string userCode){

}
[HttpPost]
公共异步任务CreateMultiple([FromBody]字符串用户代码){
}
[HttpGet]
公共异步任务CreateMultiple(字符串用户代码){
}

对ajax方法进行如下更改,可能会对您有所帮助。多谢各位

或者简单地更改ajax方法数据属性,如 例如:-data:JSON.stringify(sendData)到data:({users:sendData})


注意:“'data:({users:sendData})”中的用户是您的CreateMultiple(IEnumerable users)方法参数名

$.ajax({
            url:'@Url.Content("~/Users/CreateMultiple")', 
            async: true,
            cache:false,           
            type: 'POST',
            data: ({users:sendData}),
            error: function (jqXHR, textStatus, errorThrown) {
                console.log("FAIL: " + errorThrown);
            },
            success: function (data, textStatus, jqXHR) {
                console.log("SUCCES");
            }
        });

通过进行以下更改,我可以对其进行排序:

阿贾克斯:

控制器:

[HttpPost]
    public ActionResult CreateMultiple(List<User> users)
    {
        if (ModelState.IsValid)
        {
            foreach (User oneUser in users)
            {
                    db.Users.Add(oneUser);
                    db.SaveChanges();
            }
            return RedirectToAction("Index");
        }

        return View();
    }
[HttpPost]
public ActionResult CreateMultiple(列出用户)
{
if(ModelState.IsValid)
{
foreach(用户中的用户oneUser)
{
db.Users.Add(一个用户);
db.SaveChanges();
}
返回操作(“索引”);
}
返回视图();
}
@rStackSharper

只需确保后端和前端的用户模型具有相同的属性

例如:

在你的后端

class User
{
   public string FirstName { get; set; }
   public string LastName { get; set; }
}
在你的前端应该是

var user = { FirstName: "John", LastName: "Doe" };
或者如果你为它创建了一个函数

function user(){

    this.FirstName = "John";
    this.LastName = "Doe";  
}
然后,当您将其发送到服务器时,您必须将其发送到JSON.stringify(用户)才能被接受

function user(){

    this.FirstName = "John";
    this.LastName = "Doe";  
}