簡體   English   中英

MVC 5 Ajax 調用數據庫返回錯誤

[英]MVC 5 Ajax call to database returning error

我是 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);
    }

索引.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

您的問題是控制器操作中的參數:

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替換為您的用戶類實際上是什么

您的 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和“Company”屬性的視圖模型,然后將視圖模型屬性映射到數據模型的新實例並保存數據模型。 我還建議Name屬性應該是NOT NULL (也可能是Company

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM