Ajit Kumar Pandit Ответов: 1

Необязательный параметр должен быть ссылочным типом, типом, допускающим значение 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

1 Ответов

Рейтинг:
4

Karthik_Mahalingam

UpdateProduct(int id, TblProductList product)

Для UpdateProduct Метод вам придется пройти id и еще object, так как id отсутствует, вы получаете ошибку

добавить это
data: {id:id,product:product},