C# 如何使用实体框架asp.net mvc5保存相关数据?

C# 如何使用实体框架asp.net mvc5保存相关数据?,c#,json,asp.net-mvc,entity-framework,razor,C#,Json,Asp.net Mvc,Entity Framework,Razor,在实体框架中保存相关数据对我来说一直是一个挑战,特别是当我没有下拉列表或其他东西来选择主表的主键数据时。为了让您更详细地了解我的问题所在,让我向您展示我的代码中包含的内容: 我有两个模型,一个称为Product,第二个称为Review,Product model类包含产品的所有字段以及名为Review的导航属性,如下所示。值得一提的是,在Product and Reviews表上设置了一对多关系,其中一个产品可以有多个评论 public class Product {

在实体框架中保存相关数据对我来说一直是一个挑战,特别是当我没有下拉列表或其他东西来选择主表的主键数据时。为了让您更详细地了解我的问题所在,让我向您展示我的代码中包含的内容: 我有两个模型,一个称为Product,第二个称为Review,Product model类包含产品的所有字段以及名为
Review
的导航属性,如下所示。值得一提的是,在Product and Reviews表上设置了一对多关系,其中一个产品可以有多个评论

 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; }
    }
我有一个名为
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>
问题就从这里开始,一切似乎都很好。唯一一个难题是,我不知道如何获取由
ProductDetails
view方法获取的该产品的ProductID,并将其传递给我的
CreateReview JsonResult
以创建新的评论。任何帮助都将不胜感激,提前谢谢


问题太长了,只是为了弄个身份证,不是吗?抱歉,伙计们,我是编程新手。

进行此设置的一种方法是,您可以让您的
CreateReview
方法也使用productID

@Url.Action("CreateReview", "Product", new { productID = model.ProductID } )
以及您的
CreateReview
方法:

public JsonResult CreateReview (Review review, int productID){
    ...
}

将调用更改为局部视图:

@Html.Partial("_CreateReview", new Review { ProductId = @model.ProductId } )
更改您的创建例程:

[HttpPost]
public JsonResult CreateReview (Review review) 
{
    if (ModelState.IsValid) 
    {
            db.Reviews.Add(review);
            db.SaveChanges();
            return Json(true);    
    }

    return Json(false);
}

你能解释一下什么是productID和model.productID吗?你有没有注意到我在CreateReview部分中使用了review模型?猜猜看productID是什么?我用了它们,就像你用的一样。视图中的模型包含一个
ProductID
,当您将
Review
对象发布到
CreateReview
方法时,需要该ID。我建议您将该模型参数作为第二个参数带到
CreateReview
方法中
productID
是第二个参数,可以是任何东西,它只是一个占位符。您如何调用_CreateReview?您传递的是什么模型?如果您试图创建审阅,您的CreateReview代码看起来不正确-应该是db.Reviews.Add(审阅);在那里。我通过了审查模型,它有什么问题吗?只要看看下面的url,你就会猜出来@SteveGreene那么你对这个案子有什么建议?我被卡住了!是,我想创建一个评论
@Html.Partial("_CreateReview", new Review { ProductId = @model.ProductId } )
[HttpPost]
public JsonResult CreateReview (Review review) 
{
    if (ModelState.IsValid) 
    {
            db.Reviews.Add(review);
            db.SaveChanges();
            return Json(true);    
    }

    return Json(false);
}