Muhammd Aamir Ответов: 1

Вставка данных в базу данных из нескольких частичных представлений в MVC


Всем привет...
как и все остальные, я также здесь, чтобы обсудить свою проблему с кодом...
Я новичок в MVC и хочу вставить данные из нескольких частичных представлений, но столкнулся с проблемой. Я заполнил выпадающий список из модели "категория", и у меня есть еще одна модель, которая является моделью" продукт". все поля ввода, кроме dropdownlist, являются razor с помощью модели продукта, но dropdownlist является razor с помощью модели категории.Вспомни! Я использую ADO.NET в этом проекте нет EntityFramework.У меня есть реляционная база данных на заднем конце, которая содержит отношение продукта и категории. Все работает нормально но когда я нажимаю на кнопку Отправить я хочу вставить идентификатор выбранного элемента в выпадающий список но я сталкиваюсь с ошибкой
который...

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Products_Catagories". The conflict occurred in database "MVC-DB", table "dbo.Catagories", column 'Cat_ID'.


Что я уже пробовал:

Вот что я пытаюсь сделать..
Функция в базе данных для вставки данных
public void CreateProducts(Products product)
   {
       CategoryAdminPanel cat = new CategoryAdminPanel();
       string query = "Insert into Products (P_Name,P_Image,P_Price,P_CatagoryID) Values (@name,@image,@price,@category)";
       SqlConnection con = new SqlConnection(con_string);
       con.Open();
       SqlCommand cmd = new SqlCommand(query,con);
       cmd.Parameters.AddWithValue("@name",product.P_Name);
       cmd.Parameters.AddWithValue("@image", product.P_Image);
       cmd.Parameters.AddWithValue("@price",product.P_Price);
       cmd.Parameters.AddWithValue("@category", cat.Cat_ID);
       cmd.ExecuteNonQuery();
       con.Close();
   }


мой контроллер..
[HttpPost]
       [ValidateAntiForgeryToken]
       public ActionResult CreateProductsByAjaxCall(Products product)
       {
           if (ModelState.IsValid)
           {
               db.CreateProducts(product);
           }
           return RedirectToAction("Index");
       }


Моя Модель Продукта
public class Products
{
    public int P_ID { get; set; }
    public string P_Name { get; set; }
    public string P_Image { get; set; }
    public int P_Price { get; set; }
    public int P_CatedoryID { get; set; }
}


Моя Модель Катагории..

public class CategoryAdminPanel
    {
        public int Cat_ID { get; set; }
        [Required]
        public string Cat_Name { get; set; }
    }

sachin.vishwa90

вам нужно проверить, что такое ценность в кошке.Cat_ID при публикации вашей модели. подозреваю, что ценность в коте.Cat_ID не существует, есть ваш dbo.Категории таблица. вот почему вы получаете эту ошибку.
если это так,то ваша модель не публикует правильное значение из представления. Вот в чем проблема.
для большей ясности опубликуйте также код вашего представления

Muhammd Aamir

@sachin.vishwa90 значение в cat_ID равно нулю "0", когда я использую точку останова для этой функции... теперь вот и моя точка зрения.

@модель веб-приложения.Модели.Продукты

создать продукты


@using (Html. BeginForm())
{
@Html. AntiForgeryToken()

@HTML-код.ValidationSummary(истина, "", новые { @класс="текст-опасность"})

@Html. LabelFor(model = & gt; model.P_Name, " Product Name:", htmlAttributes: new { @class= " control-label col-md-2"})

@Html. EditorFor(model = & gt; model.P_Name, new { htmlattributes = new { @class= " form-control"} })
@Html. ValidationMessageFor(model = & gt; model.P_Name, "", new { @class= " text-danger"})



@Html. LabelFor(model = & gt; model.P_Image, "загрузить изображение:", htmlAttributes: новые { @класс = "контроль-метки коль-МД-2" })

@Html. EditorFor(model = & gt; model.P_Image, новый { htmlattributes = новый { @класс = "форма контроля" ,тип="файл"} })
@Html. ValidationMessageFor(model = & gt; model.P_Image, "", new { @class = " text-danger" })



@Html. LabelFor(model = & gt; model.P_Price, "продукция цена за единицу:", htmlAttributes: новые { @класс = "контроль-метки коль-МД-2" })

@Html. EditorFor(model = & gt; model.P_Price, new { htmlattributes = new { @class = " form-control" } })
@Html. ValidationMessageFor(model = & gt; model.P_Price, "", new { @class = " text-danger" })




@Html. LabelFor(model = & gt; model.P_CatedoryID, "категория продукции:", htmlAttributes: новые { @класс = "контроль-метки коль-МД-2" })

@* Здесь я называю свое частичное представление, которое заполняет выпадающий список *@
@Html. Partial ("CreateProductsByAjaxCallDDLOnly")

Кнопка Здесь ..
}

Muhammd Aamir

Вот мой частичный код просмотра..

@модель веб-приложения.Модели.CategoryAdminPanel


@Html. DropDownList ("Категории", (SelectList)ViewBag.RequiredKey, new { @class = " form-control" })

sachin.vishwa90

вы знаете, что вы также можете отлаживать представление. теперь вам нужно понаблюдать, какова ценность вашей модели.P_CategoryID, потому что то же самое значение будет разнесено из вашего представления. И еще одна вещь, которую вы заметите в своем коде при вставке значения в вашу таблицу, вы используете следующее,
CategoryAdminPanel cat = new CategoryAdminPanel (); / / создать новый объект
УМК.Параметры.AddWithValue ("@category", cat.Cat_ID); / / ввод значения из объекта cat, так как он не имеет с ним никакого значения.

где, как вы должны выбирать categoryId из вашей модели продукта в качестве продукта.P_CatedoryID;
проверьте, работает ли это.

Muhammd Aamir

абсолютно Вы становитесь ближе в поиске моей проблемы... я попробовал это прямо сейчас, но проблема снова та же. ценность в продукте.P_CategoryID равен нулю "0". я ценю ваши знания сейчас пришла к пинту, который я заполнения мой dropdownlist Для от категории модели, как можно получить идентификатор catid, когда я нажимаю на кнопку Отправить, когда я использовал этот "CategoryAdminPanel кошка = новый CategoryAdminPanel()" вы правы, он создаст новый объект, но как я могу получить идентификатор catid, если я не использую этот...

Muhammd Aamir

Выпадающий список заполняется из модели CategoryAdminPanel, а не из продуктов. так что у продукта не было никакого определения этого

sachin.vishwa90

вы можете сделать это очень просто, имея viewModel, который будет состоять из всех свойств, необходимых в вашем представлении, это также будет включать в себя свойства, которые вы хотите на вашем посту обратно.
проверьте ссылку ниже это определенно поможет вам
https://www.aspsnippets.com/Articles/Bind-Populate-DropDownList-from-database-using-Model-in-ASPNet-MVC-Razor.aspx

j snooze

Я не знаю, помогает ли это, но со времен моего новичка MVC я постепенно начал использовать viewmodels вместо самих моделей внутри моих представлений. Я создал объекты модели представления, которые инкапсулировали все необходимые мне свойства. Например, модель вашего продукта. Выглядеть хорошо. Если у вас была модель представления продукта под названием public class ProductViewModel, которая имела все ваши свойства продукта плюс добавьте эти 2 дополнительных свойства.
public int Cat_id {get;set;}
публичный виртуальный список & lt;categoryadminpanel> Categories{ get; set; }

Добавьте это к вашему представлению...
@Html. DropDownListFor(model = & gt; model.Cat_Id, новый список выбора(модель.Категории, "Cat_ID", "Cat_Name"), "категория", новые { @класс = "форма контроля", @идентификатор = "[код выпадающего списка имя ID]" })

Поэтому перед тем, как показать представление, очевидно, что вместо того, чтобы заполнять свой viewbag списком, вы устанавливаете категории своей модели продукта в список категорий. Когда кто-то выберет один из них и отправит ваши модели, свойство Cat_id будет заполнено. Надеюсь, это поможет. (Вы не должны частичным видом на выпадающий...есть причина, почему его в свое собственное частичное представление?)

sachin.vishwa90

Эй, парень, это одно из решений, которое определенно поможет ему.

Prateek Dalbehera

попробуйте отладить и проверить, какие значения поступают во время выполнения, пожалуйста, проверьте свой код БД, вставив те же данные , непосредственно запустив инструкцию INsert в sql server. Если его не вставляют, чем есть проблема с FK else, проверьте свой код C#, чтобы проверить, какое значение он отправляет в базу данных

Muhammd Aamir

@Prateek Dalbehera значение в Cat_ID равно' 0 ' нулю, когда я отлаживаю свой код ... и я столкнулся с этой ошибкой
Оператор INSERT конфликтует с ограничением внешнего ключа "FK_Products_Catagories". Конфликт произошел в базе данных "MVC-DB", таблице" dbo.Catagories", столбце "Cat_ID".
что мне придется сделать, чтобы решить этот вопрос..

Prateek Dalbehera

похоже, что проблема заключается в том, что ваша часть БД не находится в коде. Пробовали ли вы вставлять одно и то же значение непосредственно через ssms? Пожалуйста, попробуйте вставить в sql server и вернуться обратно.

Muhammd Aamir

я вставил в БД, но он работает нормально, до сих пор нет никаких проблем с БД..

Prateek Dalbehera

Пожалуйста, перекрестно проверьте значение Cat_ID в режиме отладки. Похоже, что из приложения значение, которое вы пытаетесь вставить, нарушает ограничение внешнего ключа. Кроме того , при прямой вставке в БД вы использовали '0' в качестве CAt_ID??

Muhammd Aamir

@Prateek Dalbehera спасибо, что поделились своими знаниями кто-то недавно нашел мое решение теперь мой код работает хорошо спасибо еще раз

Muhammd Aamir

@Prateek Dalbehera большое вам спасибо за то, что вы поделились своими знаниями и потратили некоторое ценное время, уделяя внимание моей проблеме.. кто-то из проекта code недавно нашел мое решение, и теперь мой код работает хорошо thankx еще раз

Prateek Dalbehera

Хорошо, тогда, пожалуйста, поделитесь проблемой и решением, чтобы она могла помочь другим. Спасибо.

Muhammd Aamir

Проверьте мое решение, если вы нашли в нем какую-либо проблему, пожалуйста, дайте мне знать... поэтому я могу вкратце описать вас

1 Ответов

Рейтинг:
5

Muhammd Aamir

Я нашел решение этой проблемы.. Проблема в том, что когда я передаю значение viewbage моему частичному представлению, оно работает нормально, но когда я выбираю значение ddl и пытаюсь отправить его в базу данных, оно не распознает, какое значение ddl выбрано, поэтому мне нужно использовать "P_CategoryID" в качестве идентификатора DDL, который является моим свойством класса "product" вместо ключевого слова ViewBag reserve "Category"."

вот мой контроллер, который заполняет DDL:

public ActionResult CreateProductsByAjaxCall()
     {
         ViewBag.P_CatedoryID = new SelectList(db.GetALLCategoriesForProducts(), "Cat_ID", "Cat_Name");
         //ViewBag.Categories = db.GetALLCategoriesForProducts().Select(x => new SelectListItem { Text = x.Cat_Name, Value = x.Cat_ID.ToString() });
         return PartialView();
     }


изменив идентификатор выпадающего списка с "категория" на "P_CatedoryID"
@Html.DropDownList("Category", (SelectList)ViewBag.RequiredKey, new { @class = "form-control" })


Теперь мой код просмотра выглядит так

@Html.DropDownList("P_CatedoryID", (SelectList)ViewBag.RequiredKey, new { @class = "form-control" })