Вставка данных в базу данных из нескольких частичных представлений в 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
Проверьте мое решение, если вы нашли в нем какую-либо проблему, пожалуйста, дайте мне знать... поэтому я могу вкратце описать вас