MVC 5 Ajax调用数据库返回错误

时间:2015-08-29 23:13:34

标签: c# ajax asp.net-mvc

我是MVC的新手,到目前为止,我已经连接了我的数据库并使用默认的CRUD创建了一个实体控制器类。

然而,在我的Index.cshtml我试图用ajax脚本更新数据库,但是我收到了一个错误,我不知道从那里去哪里。

Database : MyDB

Users Table
==========================================
| Column     | Type         |            |
==========================================
| ID         | int          | Primary AI |
------------------------------------------
| Name       | varchar (50) | NULL       |
------------------------------------------
| Company    | varchar (50  | NULL       |
==========================================

MyDBsController.cs

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ID,Name,Company")] MyDB myDB)
    {
        if (ModelState.IsValid)
        {
            db.Users.Add(myDB);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(myDB);
    }

Index.cshtml

<script>
$('a').click(function () {
    $name = "John";
    $company = "123Moving";

    $.ajax({
        url: '@Url.Action("Create", "MyDBsController")',
        data: { 'Name': $name, 'Company' : $company },
        type: "post",
        cache: false,
        success: function () {
            alert("Success");
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert(xhr + ajaxOptions + thrownError);
        }

    })
})
</script>

我得到的错误是[Object object] error not found

2 个答案:

答案 0 :(得分:0)

您的问题是控制器操作中的参数:

public ActionResult Create([Bind(Include = "ID,Name,Company")] MyDB myDB)

您正在尝试POST User到一个控制器,该控制器需要MyDB,而我猜测的是您的DBContext。它应该是:

public ActionResult Create([Bind(Include = "ID,Name,Company")] User user)

User替换为您的实际用户类

答案 1 :(得分:0)

您的POST方法使用[ValidateAntiForgeryToken]属性进行修饰,但您的ajax调用未传递令牌,因此该方法永远不会运行..

删除该属性,或者如果您的表单包含@Html.AntiForgeryToken(),则可以使用

传递令牌
var token = $('[name=__RequestVerificationToken]').val();
$.ajax({
  ....
  data: { 'Name': $name, 'Company': $company, '__RequestVerificationToken': token },

或更好,假设您拥有NameCompany的表单控件,只需使用

data: $('form').serialize(),

将序列化所有表单数据,包括令牌。

此外,正如另一个答案中所述的drneel,您的模型似乎是User,而不是MyDB所以它将是

public ActionResult Create(User user)

旁注;您似乎想要建模的所有属性,因此您的[Bind(Include = "..")]属性有点无意义(默认情况下包含所有属性)。话虽如此,ID(主键)属性在“创建”中并不合适。方法和恶意用户可以轻松回发ID值,导致您的方法失败。您应该使用仅包含Name和&#39;公司&#39;的视图模型。然后,将视图模型属性映射到数据模型的新实例并保存数据模型。我还建议Name属性应该是NOT NULL(也可能是Company