【问题标题】:How do i save related data using entity framework asp.net mvc5?如何使用实体框架 asp.net mvc5 保存相关数据?
【发布时间】: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


【解决方案1】:

将您的调用更改为局部视图:

@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);
}

【讨论】:

    【解决方案2】:

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

    @Url.Action("CreateReview", "Product", new { productID = model.ProductID } )
    

    还有你的CreateReview 方法:

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

    【讨论】:

    • 请解释一下productID和model.ProductID是什么?
    • 您是否注意到我在 CreateReview 部分中使用了评论模型?所以猜猜productID是什么?
    • 我完全按照您的使用方式使用它们。您视图中的模型包含一个ProductID,当您将Review 对象发布到您的CreateReview 方法时,您需要该ID。我建议您将该模型参数作为第二个参数带到CreateReview 方法中。 productID 是第二个参数,可以是任何东西,它只是一个占位符。
    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多