【发布时间】:2016-02-20 18:18:08
【问题描述】:
在实体框架中保存相关数据对我来说一直是一个挑战,特别是当我没有下拉列表或其他东西来选择主表的主键数据时。因此,为了让您更详细地了解我的问题,让我向您展示我的代码中的内容:
我有两个模型,一个是 Product,第二个是 Review,Product 模型类包含一个产品的所有字段以及一个名为 Review 的导航属性,如下所示。值得一提的是,产品和评论表上设置了一对多关系,其中一个产品可以有很多评论。
public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public string ProductDescription { get; set; }
public decimal ProductPrice { get; set; }
public string ProductCategory { get; set; }
public Boolean ProductIsUnlimited { get; set; }
public Boolean ProductAvailable { get; set; }
public Boolean DiscountAvailable { get; set; }
public byte[] MainPicture { get; set; }
public string MainPictureMimeType { get; set; }
public byte[] SecondPicture { get; set; }
public string SecondPictureMimeType { get; set; }
public byte[] ThirdPicture { get; set; }
public string ThirdPictureMimeType { get; set; }
[HiddenInput(DisplayValue=false)]
public virtual ICollection<Review> Reviews { get; set; }
}
审查模型包含审查所需的所有字段,如下所示。
public class Review
{
[HiddenInput(DisplayValue=false)]
public int ReviewId { get; set; }
[Required]
public int ProductID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Subject { get; set; }
[Required]
public string Body { get; set; }
}
我有一个名为ProductController 的控制器,在该控制器上我定义了一个ViewResult 方法来从数据库中获取产品,然后当然使用产品上的Review 导航属性来获取与该产品相关的所有评论模型。这里方法ProductDetails
public ViewResult ProductDetails(int productId)
{
Product product = repository.Products
.Include(p => p.Reviews)
.FirstOrDefault(p => p.ProductID == productId);
return View(product);
}
这样我就可以查看上面显示产品详细信息和评论的方法,评论放置在部分视图中,我在 ProductDetails 主视图中调用。然后我有另一个名为 _CreateReview 的局部视图,其中一个表单驻留在此局部视图中,其中包含一些用于创建新评论的脚本,如此处所示。
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.ProductID)
@Html.EditorFor(m => m.Name)
@Html.EditorFor(m => m.Subject)
@Html.TextAreaFor(m => m.Body)
<input id="Submit" type="submit" value="Submit" />
}
<script>
var url = '@Url.Action("CreateReview", "Product")';
var reviews = $('#reviews');
var form = $('form');
$('#Submit').click(function () {
$.post(url, form.serialize(), function (response) {
if (response) {
reviews.append($('#col-sm-12').val()); // add the new Review to the existing reviews
form.get(0).reset(); // reset the form controls
}
}).fail(function (result) {
// oops
});
return false; // cancel the default submit
});
</script>
正如您在上面的脚本中看到的,我将数据发布到控制器 CreateReview 操作以保存评论。这里是CreateReview JsonResult 方法。
[HttpPost]
public JsonResult CreateReview (Review review)
{
Review dbEntry = db.Reviews.Find(review.ReviewId);
if (dbEntry != null)
{
dbEntry.ProductID = review.ProductID;
dbEntry.Name = review.Name;
dbEntry.Subject = review.Subject;
dbEntry.Body = review.Body;
}
db.SaveChanges();
return Json(true);
}
问题从那里开始,一切似乎都很好,唯一缺少的一块拼图是我无法弄清楚如何获取由ProductDetails 视图方法获取的该产品的 ProductID 并传递它到我的CreateReview JsonResult 来创建新评论。任何帮助将不胜感激,在此先感谢。
问题太长,无法获得 ID,不是吗?对不起,我是编程新手。
【问题讨论】:
-
您如何调用_CreateReview 以及您传递的是什么模型?如果您尝试创建评论,您的 CreateReview 代码看起来不正确 - 应该是 db.Reviews.Add(review);在那里。
-
我通过了Review模型,有什么问题?
-
只要看看下面的网址,你就猜到了。 localhost:2158/Product/ProductDetails?ProductID=191
-
@SteveGreene 那么您对此案有何建议?我被卡住了!
-
是的,我想创建评论
标签: c# json asp.net-mvc entity-framework razor