Необязательный параметр должен быть ссылочным типом, типом, допускающим значение null, или объявлен как необязательный параметр.
Привет, ребята, я использую Knockout Js для выполнения операции Crud в MVC. Операции Select, Add, Delete работают нормально, но показывают ошибку с операцией Update. Ошибка есть
-------------------------------------------------------
КЛАСТЬ XHR http://localhost:58258/Product/UpdateProduct [HTTP/1.1 404 не найден 2 мс]
--------------------------
Когда я нажимаю на приведенную выше ссылку, она показывает следующую ошибку
-------------------------------------------------
Словарь параметров содержит нулевую запись для параметра 'id' ненулевого типа 'System. Int32' для метода ' System.Web.Mvc.JsonResult UpdateProduct(Int32, MvcWithKnockoutJS.Модели.TblProductList) ' in 'MvcWithKnockoutJS. Controllers.Productcontroller в'. Необязательный параметр должен быть ссылочным типом, типом, допускающим значение null, или объявлен как необязательный параметр.
Имя параметра: parameters
Что я уже пробовал:
Кодирование в файле KnockoutJs
-------------------------------
функция formatCurrency(значение) {
return " ₹ " + value. toFixed(2);
}
функция ProductViewModel() {
// Сделайте самость "этой" ссылкой
var self = это;
// Declare observable, который будет привязан к пользовательскому интерфейсу
сам.ИД = ко.наблюдаемые("");
сам.Название = ко.наблюдаемые("");
сам.Цена = ко. наблюдаемая("");
сам.Категория = ko. observable("");
продукт var = {
ИД: самостоятельно.Идентификатор,
Имя: собственная личность.Название,
Цена: self.Цена,
Категория: самость.Категория
};
сам.Продукт = ko. наблюдаемый();
сам.Products = ko. observableArray (); / / содержит список продуктов
// Инициализировать модель представления
$.Аякс({
url: 'Product/GetAllProducts',
кэш: false,
тип: "получить",
contentType: 'application/json; charset=utf-8',
данные: {},
успех: функция (данные) {
сам.Продукты (данные); / / поместите ответ в ObervableArray
}
});
// Рассчитать общую цену после инициализации
сам.Total = ko. computed(функция () {
var sum = 0;
var arr = самость.Продукты();
для (ВАР я = 0; Я &л; обр. длина; я++) {
сумма += arr[i].Цена;
}
возврат суммы;
});
// Добавить Новый Элемент
самостоятельно.создать = функция () {
если (Product.Name () ! = "" & & amp; продукт.Price ()! = "" & & amp; Product.Категория ()! = "") {
$.Аякс({
url: 'Product/AddProduct',
кэш: false,
тип: "пост",
contentType: 'application/json; charset=utf-8',
сведения: ко -.метод toJSON(продукта),
успех: функция (данные) {
сам.Products. push(данные);
самостоятельно.Название("");
сам.Цена("");
сам.Категория("");
предупреждение ("продукт был успешно добавлен!");
}
}).потерпеть неудачу(
функция (xhr, textStatus, err) {
оповещения(ошибаться);
});
}
ещё {
alert ('EMPLY FIELDS ARE NOT ALLOWED\n--------------------------------------------------------------\nPlease введите все значения.все поля обязательны для заполнения.');
}
}
// Удалить Сведения О Продукте
self. delete = функция (продукт) {
если (подтвердите("вы уверены, что удалите") + продукт.Название + '" продукт ??')) {
ВАР ID = продукт.Идентификатор;
$.Аякс({
url: 'Product/DeleteProduct/' + id,
кэш: false,
тип: "пост",
contentType: 'application/json; charset=utf-8',
данные: id,
успех: функция (данные) {
сам.Продукты.удалить(продукта);
предупреждение ("продукт удален!");
}
}).потерпеть неудачу(
функция (xhr, textStatus, err) {
самостоятельно.статус(ошибаться);
});
}
}
// Редактировать Сведения О Продукте
self. edit = функция (продукт) {
сам.Продукт(Product);
}
// Обновление Сведений О Продукте
самостоятельно.функция обновления = () {
var Product = self.Продукт();
ВАР ID = продукт.Идентификатор;
консоли.журнал(ИД);
если (продукт.Имя ! = "" & amp; продукт.Цена ! = "" & amp; Product.Категория != "") {
$.Аякс({
url: 'Product/UpdateProduct',
кэш: false,
типа: "пут",
contentType: 'application/json; charset=utf-8',
сведения: ко -.метод toJSON(продукта),
успех: функция (данные) {
сам.Продукты.метод removeall();
сам.Продукты (данные); / / поместить ответ в observableArray
сам.Продукт(null);
предупреждение ("запись успешно обновлена!");
}
}). fail(функция (xhr, textStatus, err) {
оповещения(ошибаться);
});
}
ещё {
предупреждение ("пустые поля не допускаются!");
}
}
// Сброс Сведений О Продукте
самостоятельно.сброс = функция () {
самостоятельно.Название("");
сам.Цена("");
сам.Категория("");
}
// Отмена Сведений О Продукте
самостоятельно.отменить = функция () {
сам.Продукт(null);
}
}
var viewModel = новый ProductViewModel();
ко.applyBindings(модель представления);
----------------------------------------------
Кодирование в классе контроллеров
----------------------------------------------
использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
использование системы.Сеть;
использование System. Web.Mvc;
используя MvcWithKnockoutJS.Репозитории;
использование MvcWithKnockoutJS.Модели;
пространство имен MvcWithKnockoutJS. Controllers
{
public class ProductController : контроллер
{
// Ссылки - https://www.codeproject.com/Tips/1072693/CRUD-in-ASP-NET-MVC-with-KnockOut-JS
статический репозиторий ProductRepository только для чтения = новый ProductRepository();
// GET: продукт
продукты public ActionResult()
{
возвращение смотреть();
}
public JsonResult GetAllProducts()
{
возвращает JSON(в репозитории.GetAll (), JsonRequestBehavior.AllowGet);
}
public JsonResult AddProduct (элемент TblProductList)
{
item = репозиторий.Добавить элемент);
return Json(item, JsonRequestBehavior.AllowGet);
}
public JsonResult UpdateProduct(int id, tblproductlist product)
{
продукт.Идентификатор = идентификатор;
если (репозитория.Обновление (продукт))
возвращает JSON(в репозитории.GetAll (), JsonRequestBehavior.AllowGet);
return Json(null);
}
public JsonResult DeleteProduct(int id)
{
если (репозитория.Удалить (id))
return Json(new { Status = true }, JsonRequestBehavior.AllowGet);
return Json(new { Status = true }, JsonRequestBehavior.AllowGet);
}
}
}
----------------------------------------------------
Кодирование в интерфейсном классе-это
------------------------------------
использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
использование системы.Сеть;
использование MvcWithKnockoutJS.Модели;
пространство имен MvcWithKnockoutJS.Межфазные границы
{
интерфейс IProductRepository
{
IEnumerable<tblproductlist> GetAll();
TblProductList Get (int id);
Tblproductlist Add (элемент TblProductList);
обновление bool (элемент TblProductList);
bool Delete(int id);
}
}
-----------------------------------------------------------------
Кодирование в классе реализации элемента интерфейса
--------------------------------------------
использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
использование системы.Сеть;
использование MvcWithKnockoutJS.Межфазные границы;
использование MvcWithKnockoutJS.Модели;
пространство имен MvcWithKnockoutJS. Repositories
{
публичный класс ProductRepository : IProductRepository
{
MvcWithKnockoutJSEntities connectDB = новые MvcWithKnockoutJSEntities();
// Реализация элемента интерфейса для получения всех записей из базы данных.
public IEnumerable<tblproductlist> GetAll()
{
// To DO: код для получения списка всех записей в базе данных
возврат connectDB.TblProductLists;
}
// Реализация элемента интерфейса для получения записи по идентификатору из базы данных
public TblProductList Get (int id)
{
// To DO: код для поиска записи в базе данных
верните connectDB.TblProductLists.Найти (id);
}
// Реализация элемента интерфейса для вставки данных
public Tblproductlist Add (элемент TblProductList)
{
if (item = = null)
{
throw new ArgumentNullException ("item");
}
// To DO: код для сохранения записи в базу данных
connectDB.TblProductLists.Добавить элемент);
connectDB.Метод SaveChanges();
возврат товара;
}
// Реализация элемента интерфейса для обновления данных в базу данных
public bool Update(элемент TblProductList)
{
if (item = = null)
throw new ArgumentNullException ("item");
// To DO: код для обновления записи в базу данных
продукты ВАР = connectDB.TblProductLists.Одиночный (a => a.Id == item.Id);
продукты.Наименование = элемента.Название;
продукты.Категория = товар.Категория;
продукты.Цена = товар.Цена;
connectDB.Метод SaveChanges();
вернуть true;
}
// Реализация элемента интерфейса для удаления данных из базы данных
public bool Delete(int id)
{
// To DO: код для удаления записей из базы данных
DeleteItems TblProductList = connectDB.TblProductLists.Найти (id);
connectDB.TblProductLists. Remove(deleteItems);
вернуть true;
}
}
}
Karthik_Mahalingam
какая линия
Ajit Kumar Pandit
Следующее направление
------------------------------
// Обновление Сведений О Продукте
самостоятельно.функция обновления = () {
var Product = self.Продукт();
ВАР ID = продукт.Идентификатор;
консоли.журнал(ИД);
если (продукт.Имя ! = "" & amp; продукт.Цена ! = "" & amp; Product.Категория != "") {
$.Аякс({
url: 'Product/UpdateProduct',
кэш: false,
типа: "пут",
contentType: 'application/json; charset=utf-8',
сведения: ко -.метод toJSON(продукта),
успех: функция (данные) {
сам.Продукты.метод removeall();
сам.Продукты (данные); / / поместить ответ в observableArray
сам.Продукт(null);
предупреждение ("запись успешно обновлена!");
}
}). fail(функция (xhr, textStatus, err) {
оповещения(ошибаться);
});
}
ещё {
предупреждение ("пустые поля не допускаются!");
}
}
Karthik_Mahalingam
то, что вы получаете в var Product = self.Продукт();
Ajit Kumar Pandit
продукт var = {
ИД: самостоятельно.Идентификатор,
Имя: собственная личность.Название,
Цена: self.Цена,
Категория: самость.Категория
};
Karthik_Mahalingam
тут ID и самостоятельно.идентификатор одинаковы ?
Ajit Kumar Pandit
Да, только Id и id отличаются.
Karthik_Mahalingam
проверьте решение
Ajit Kumar Pandit
Я пробовал ваше решение, но оно также бросает меня с той же ошибкой. Я пытался решить эту проблему со вчерашнего дня, но все еще чувствовал себя беспомощным. Спасибо за все ваши ответы.
Karthik_Mahalingam
попробуйте жестко закодировать в него значение id = 0.
Ajit Kumar Pandit
Я имею в виду, что id-это локальная переменная, а Id-глобальная переменная
Karthik_Mahalingam
но ваш actionmethod имеет два аргумента для указания, вы должны передать 2 параметра, иначе он выдаст ошибку.
Ajit Kumar Pandit
Я передаю то же самое(два параметра), все еще получая ту же проблему. Я показал вам все свои коды выше.
Karthik_Mahalingam
это то, что я пробовал, и это работает круто
var Product = { Id: 1, Name:'a' }; var id = 1; $.ajax({ type: "POST", url: './home/save1', data: { id: id, product: Product }, dataType: "json", success: function (d) { console.log(d); } });
public class Product { public int Id { get; set; } public string Name { get; set; } } public class HomeController : Controller { public ActionResult Save1(int id, Product prod) { return Json(""); }
Ajit Kumar Pandit
В моем случае я не сталкиваюсь с какой-либо проблемой выбора, добавления или удаления, но получаю проблему во время обновления. Не могли бы вы взглянуть на нижеприведенный вызов ajax для обновления модели представления?
--------------------------------------------------
// Обновление Сведений О Продукте
самостоятельно.функция обновления = () {
var Product = self.Продукт();
ВАР ID = продукт.Идентификатор;
консоли.журнал(продукта);
консоли.журнал(ИД);
если (продукт.Имя ! = "" & amp; продукт.Цена ! = "" & amp; Product.Категория != "") {
$.Аякс({
url: 'Product/UpdateProduct',
кэш: false,
типа: "пут",
contentType: 'application/json; charset=utf-8',
//данные: ko. toJSON(id, Product),
сведения: { идентификатор: идентификатор продукта: },
успех: функция (данные) {
сам.Продукты.метод removeall();
сам.Продукты (данные); / / поместить ответ в observableArray
сам.Продукт(null);
предупреждение ("запись успешно обновлена!");
}
}). fail(функция (xhr, textStatus, err) {
оповещения(ошибаться);
});
}
ещё {
предупреждение ("пустые поля не допускаются!");
}
}
Karthik_Mahalingam
сведения: { идентификатор: идентификатор продукта: },
продукт-меньший корпус
Ajit Kumar Pandit
Здравствуйте, сэр, я переодеваюсь
--------------------
type: 'PUT' to type: 'POST', и он работает нормально.
Karthik_Mahalingam
Хорошо
Ajit Kumar Pandit
Ошибка
-----------
Поставить XHR http://localhost:58258/Product/UpdateProduct [HTTP/1.1 404 не найден 2 мс]
--------------------------
Когда я нажимаю на приведенную выше ссылку, она показывает следующую ошибку
-------------------------------------------------
Словарь параметров содержит нулевую запись для параметра 'id' ненулевого типа 'System. Int32' для метода ' System.Web.Mvc.JsonResult UpdateProduct(Int32, MvcWithKnockoutJS.Модели.TblProductList) ' in 'MvcWithKnockoutJS. Controllers.Productcontroller в'. Необязательный параметр должен быть ссылочным типом, типом, допускающим значение null, или объявлен как необязательный параметр.
Имя параметра: parameters