MVC EF - 如何将数组保存到数据库
MVC EF - How to save Array to db
我需要保存一个标签数组,我使用 angular 和 json 从视图传递到控制器。我尝试了以下但 vm.Name 出现为空。
脚本post请求
$http({
method: 'POST',
url: '/RecipeTags/CreateRecipeTag',
data: $scope.selectedTags
}).then(function (response) {
}, function () { alert('Error CreateRecipeTag'); });
样本数组
[{"Id":12,"Name":"Baking","RecipeId":0},{"Id":16,"Name":"Oriental","RecipeId":0},{"Id":17,"Name":"Japanese","RecipeId":0}]
RecipeTagsController.cs
[HttpPost]
public JsonResult CreateRecipeTag(List<RecipeTag> vm)
{
foreach (var tag in vm)
{
RecipeTag recipeTag = new RecipeTag();
recipeTag.Name = vm.Name;
recipeTag.RecipeId = vm.RecipeId;
db.RecipeTags.Add(recipeTag);
}
db.SaveChanges();
return Json(vm, JsonRequestBehavior.AllowGet);
}
RecipeTag.cs
public class RecipeTag
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Display(Name = "Tag")]
public string Name { get; set; }
[ForeignKey("Recipe")]
public int RecipeId { get; set; }
public virtual Recipe Recipe { get; set; }
}
您必须将 RecipeTag 定义为 DataContract。
像这样:
// Service definition
[ServiceContract(Name = "Service1")]
public interface IMyService
{
[OperationContract,HttpPost]
public JsonResult CreateRecipeTag(List<MyRecipeTag> vm);
}
// DataType-Definition for the Service
[DataContract]
public class MyRecipeTag
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public int RecipeId { get; set; }
public virtual Recipe Recipe { get; set; }
}
// Service implementation
public class MyService : IMyService
{
[HttpPost]
public JsonResult CreateRecipeTag(List<RecipeTag> vm)
{
foreach (var tag in vm)
{
RecipeTag recipeTag = new RecipeTag();
recipeTag.Name = tag.Name;
recipeTag.RecipeId = tag.RecipeId;
db.RecipeTags.Add(tag);
}
db.SaveChanges();
return Json(vm, JsonRequestBehavior.AllowGet);
}
}
由此,您定义了函数的 class。此 class 可以与 EF 兼容,或者您将字段复制给您调用 RecipeTag。
就像@Jasen 说的那样,我将我的动作签名更改为一个集合,并将 vm.RecipeId
更改为 tag.RecipeId
我还使 ActionResult
异步,它终于成功了!谢谢!
[HttpPost]
public async Task<ActionResult> CreateRecipeTag([Bind(Include = "Id,Name,RecipeId")] List<RecipeTag> vm)
{
foreach (var tag in vm)
{
RecipeTag recipeTag = new RecipeTag();
recipeTag.RecipeId = tag.RecipeId;
recipeTag.Name = tag.Name;
db.RecipeTags.Add(recipeTag);
await db.SaveChangesAsync();
}
return RedirectToAction("Index");
}
我需要保存一个标签数组,我使用 angular 和 json 从视图传递到控制器。我尝试了以下但 vm.Name 出现为空。
脚本post请求
$http({
method: 'POST',
url: '/RecipeTags/CreateRecipeTag',
data: $scope.selectedTags
}).then(function (response) {
}, function () { alert('Error CreateRecipeTag'); });
样本数组
[{"Id":12,"Name":"Baking","RecipeId":0},{"Id":16,"Name":"Oriental","RecipeId":0},{"Id":17,"Name":"Japanese","RecipeId":0}]
RecipeTagsController.cs
[HttpPost]
public JsonResult CreateRecipeTag(List<RecipeTag> vm)
{
foreach (var tag in vm)
{
RecipeTag recipeTag = new RecipeTag();
recipeTag.Name = vm.Name;
recipeTag.RecipeId = vm.RecipeId;
db.RecipeTags.Add(recipeTag);
}
db.SaveChanges();
return Json(vm, JsonRequestBehavior.AllowGet);
}
RecipeTag.cs
public class RecipeTag
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Display(Name = "Tag")]
public string Name { get; set; }
[ForeignKey("Recipe")]
public int RecipeId { get; set; }
public virtual Recipe Recipe { get; set; }
}
您必须将 RecipeTag 定义为 DataContract。
像这样:
// Service definition
[ServiceContract(Name = "Service1")]
public interface IMyService
{
[OperationContract,HttpPost]
public JsonResult CreateRecipeTag(List<MyRecipeTag> vm);
}
// DataType-Definition for the Service
[DataContract]
public class MyRecipeTag
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public int RecipeId { get; set; }
public virtual Recipe Recipe { get; set; }
}
// Service implementation
public class MyService : IMyService
{
[HttpPost]
public JsonResult CreateRecipeTag(List<RecipeTag> vm)
{
foreach (var tag in vm)
{
RecipeTag recipeTag = new RecipeTag();
recipeTag.Name = tag.Name;
recipeTag.RecipeId = tag.RecipeId;
db.RecipeTags.Add(tag);
}
db.SaveChanges();
return Json(vm, JsonRequestBehavior.AllowGet);
}
}
由此,您定义了函数的 class。此 class 可以与 EF 兼容,或者您将字段复制给您调用 RecipeTag。
就像@Jasen 说的那样,我将我的动作签名更改为一个集合,并将 vm.RecipeId
更改为 tag.RecipeId
我还使 ActionResult
异步,它终于成功了!谢谢!
[HttpPost]
public async Task<ActionResult> CreateRecipeTag([Bind(Include = "Id,Name,RecipeId")] List<RecipeTag> vm)
{
foreach (var tag in vm)
{
RecipeTag recipeTag = new RecipeTag();
recipeTag.RecipeId = tag.RecipeId;
recipeTag.Name = tag.Name;
db.RecipeTags.Add(recipeTag);
await db.SaveChangesAsync();
}
return RedirectToAction("Index");
}