2016-02-20 5 views
0

Сохранение связанных данных в структуре сущности всегда было для меня проблемой, особенно когда у меня нет ниспадающего списка или чего-то еще, чтобы выбрать первичные данные первичной таблицы. Поэтому, чтобы дать вам более подробную информацию о том, что моя проблема, позвольте мне показать вам, что у меня есть в моем коде: У меня есть две модели, одна из которых называется Product, а вторая - Review. Класс Model продукта содержит все поля для продукта плюс навигационное свойство называется Review, как показано ниже. Стоит упомянуть, что в таблице продуктов и отзывов есть один-много отношений, в которых у Продукта может быть много Обзоров.Как сохранить связанные данные с помощью сущности framework asp.net mvc5?

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

Так что у меня есть вид на описанном выше способом, где отображать сведения о продукте и отзывы, обзоры, помещенных в частичном виде и я называемся в главном экране Детали изделия. Тогда у меня есть еще один частичный вид по имени _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); 
     } 

Проблема начинается оттуда, все, кажется, работает просто отлично единственный кусок головоломки отсутствует, что я не мог понять, как получить ProductID этого продукта, который извлекается методом ProductDetails просмотра и перейдите к моему CreateReview JsonResult, чтобы создать новый обзор. Любая помощь была бы высоко оценена, спасибо заранее.

Слишком длинный вопрос, чтобы получить удостоверение личности, не так ли? Извините, ребята, я новичок в программировании.

+0

Как вы звоните _CreateReview и какую модель вы передаете? Ваш код CreateReview выглядит неправильно, если вы пытаетесь СОЗДАТЬ обзор - должен быть db.Reviews.Add (обзор); там. –

+0

Я передаю модель обзора, что с ней не так? –

+0

просто посмотрите на URL ниже, и вы угадаете это. http: // localhost: 2158/Продукт/ProductDetails?ProductID = 191 –

ответ

0

Изменить свой призыв к частичной взгляд:

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

Один из способов идти о с этой настройки, вы можете иметь свой CreateReview метод принять PRODUCTID, а также,

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

и ваш CreateReview Метод:

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

Не могли бы вы объяснить мне, что такое productID и model.ProductID? –

+0

Вы заметили, что я использую модель обзора в моем части CreateReview? так что только гадать, что будет productID? –

+0

Я использовал их exaxactly, как вы использовали. Модель в вашем представлении содержит «ProductID», и вам нужен этот идентификатор, когда вы отправляете объект «Review» в ваш метод «CreateReview». Я предлагаю вам взять этот параметр модели в метод 'CreateReview' как второй параметр. 'productID' - это второй пареметр, может быть что угодно, это всего лишь местозаполнитель. –

Смежные вопросы