我是MVC的新手,到目前为止,我已经连接了我的数据库并使用默认的CRUD创建了一个实体控制器类。
然而,在我的Index.cshtml
我试图用ajax脚本更新数据库,但是我收到了一个错误,我不知道从那里去哪里。
Database : MyDB
Users Table
==========================================
| Column | Type | |
==========================================
| ID | int | Primary AI |
------------------------------------------
| Name | varchar (50) | NULL |
------------------------------------------
| Company | varchar (50 | NULL |
==========================================
[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);
}
<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
答案 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 },
或更好,假设您拥有Name
和Company
的表单控件,只需使用
data: $('form').serialize(),
将序列化所有表单数据,包括令牌。
此外,正如另一个答案中所述的drneel,您的模型似乎是User
,而不是MyDB
所以它将是
public ActionResult Create(User user)
旁注;您似乎想要建模的所有属性,因此您的[Bind(Include = "..")]
属性有点无意义(默认情况下包含所有属性)。话虽如此,ID
(主键)属性在“创建”中并不合适。方法和恶意用户可以轻松回发ID
值,导致您的方法失败。您应该使用仅包含Name
和&#39;公司&#39;的视图模型。然后,将视图模型属性映射到数据模型的新实例并保存数据模型。我还建议Name
属性应该是NOT NULL
(也可能是Company
)