none
Удаление строки из таблицы RRS feed

  • Вопрос

  • Есть таблица на главном представлении Index, в конроллере пытаюсь удалить запись из таблицы, при этом ошибок не возникает, но  при запуске и нажатии соответствующей кнопки, происходит ошибка. запись в контроллере:

     public ActionResult Delete(int kod)
            {
                Obsha9 kodfio = _db.Obsha9.Find(kod);
                if (kod != null)
                {
                    _db.Obsha9.Remove(kodfio);
                    _db.SaveChanges();
                }
                return RedirectToAction("Index");

    <<<<<<ОШИБКА

    Ошибка сервера в приложении '/'.

    Словарь параметров содержит запись со значением NULL для параметра "kod" типа "System.Int32", не допускающего значение NULL, для метода "System.Web.Mvc.ActionResult Delete(Int32)" в "ReitingTeacher.Controllers.HomeController". Необязательный параметр должен иметь ссылочный тип, тип, допускающий значение NULL, либо он должен быть объявлен как необязательный параметр.
    Имя параметра: parameters

    Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

    Сведения об исключении: System.ArgumentException: Словарь параметров содержит запись со значением NULL для параметра "kod" типа "System.Int32", не допускающего значение NULL, для метода "System.Web.Mvc.ActionResult Delete(Int32)" в "ReitingTeacher.Controllers.HomeController". Необязательный параметр должен иметь ссылочный тип, тип, допускающий значение NULL, либо он должен быть объявлен как необязательный параметр.
    Имя параметра: parameters.


           
    • Изменено EvgeniyO 28 мая 2013 г. 13:58

Ответы

  • Ну развезли тут цирк))

    1 посмотри в свой роутинг - там скорее всего увидишь чтото типа такого
    "{controller}/{action}/{id}"

    так вот id тут ключевое

    и у тебя передается в твой метод id=12345/*kod*/, а метод не принимает id а принимает kod

    соответственно либо тут исправь

    @Html.ActionLink("Удалить", "Delete", new { kod= c.KodFIO }) и добавь роутинг с "{controller}/{action}/{kod}"

    либо тут исправь
    public ActionResult Delete(int id)
            {
                Obsha9 kodfio = _db.Obsha9.Find(id);
               // if (id != null)
               // {
                    _db.Obsha9.Remove(id);
                    _db.SaveChanges();
                //}
                return RedirectToAction("Index");


    P.S. с исправлением роутинга так неполучится "{controller}/{action}/{kod}" - конфликт пойдет c id
    в общем запомни что существует связь по именам которую нужно соблюдать - если в ссылке стоит id значит и в методе должен стоять id а не int yaSralNaEtoPravilo
  • проблема решена проще чем ожидалось 
     public ActionResult Delete(int? kod1)
            {
                Obsha9 kod = _db.Obsha9.Find(kod1);
    
                if (kod != null)
                {
                    _db.Obsha9.Remove(kod);
                    _db.SaveChanges();
                }
                return RedirectToAction("Index");

    @Html.ActionLink("Удалить", "Delete", new { id= c.Kod, kod1=c.Kod})

Все ответы

  • Всё просто, вы не передаёте значение для параметра kod. Он должен быть в вашем запросе. Как вы вызываете метод контроллера, через GET или POST? Покажите ваше представление.
    Модератор
  • Вот предвставление

    @{
        ViewBag.Title = "Рейтинг преподавателей кафедры  ФиПМ";
    }

    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    @using ReitingTeacher.Models
    @model IEnumerable<ReitingTeacher.Models.Obsha9>
            <table>
            <tr>
                <td><p>Наименование работ</p></td>
                <td><p>Комментарий</p></td>
                <td><p>Код ФИО</p></td>
                <td><p>Код Подраздела</p></td>
                <td><p>Количество единиц работ</p></td>
                <td><p>Документ</p></td>
                <td><p>Балл за 1 единицу работы</p></td>
                <td><p>Общий балл</p></td>
                <td><p>Действия</p></td>
                        </tr>
            @foreach (ReitingTeacher.Models.Obsha9 c in Model)
            {
                 <tr>
                    <td><p>@c.NaimenRabot</p></td>
                    <td><p>@c.Comments</p></td>
                     <td><p>@c.KodFIO</p></td>
                    <td><p>@c.KodPodrazd</p></td>
                    <td><p>@c.KolvoEdRabot</p></td>
                    <td><p>@c.Document</p></td>
                    <td><p>@c.ItogovBall</p></td>
                    <td><p>@c.Bals</p></td>
                <td>@Html.ActionLink("Редактировать", "Edit", new { id= c.KodFIO }) 
                    <h2></h2>
                    @Html.ActionLink("Удалить", "Delete", new { id= c.KodFIO })
            </td>
                      </tr>
            }
            </table>
    <form action="~/Dobav/Dobav" method="get"> 
    <input type="submit" value="Добавить запись">
    </form>
     @section featured {
        <section class="featured">
            <div class="content-wrapper">
                <hgroup class="title">
                    <h1>@ViewBag.Title.</h1>
                    <h2>@ViewBag.Message</h2>
                </hgroup>

            </div>
        </section>


            }

                   
  • Если это именно тот код, за который отвечает ваш контроллер, то я что то нигде ни вижу параметра kod, поэтому и передаётся пустое значение. Вам нужно его передавать через POST запрос как поле формы или параметр URL при POST или GET.
    Модератор
  • <form action="kod" method="get"> 

    @Html.ActionLink("Удалить", "Delete", new { id= c.KodFIO })

    </form>

    вот так?


  • Нет, не так. Примерно так.

    <form action="URL отправки формы" method="post"> 
    <input name="kod" id="kod" value="454564" />
    @Html.ActionLink("Удалить", "Delete", new { id= c.KodFIO })
    
    </form>
    Или GET @Html.ActionLink("Удалить", "Delete", new { id= c.KodFIO, kod= 45454 })
    Модератор
  • странно, но ни то ни другое не работает... та же ошибка, может быть я чего не  правильно с представлениями сделал? но у меня 1 таблица  и находится на представлении Index. К сожалению не могу отправить скриншот учетная запись не прошла проверку).
  • А почему Вы проверяете kod на null, при том, что kod у вас int, который не может быть null?

    написали бы чтоли так

    public ActionResult Delete(int? kod)
    {
      // Ваш код
    }

    или так

    public ActionResult Delete([Optional] int kod)
    {
      // Ваш код
    }

    как-то так там с параметром.
    Хотя, всё равно на null проверка будет работать только с 1-м вариантом.

    И вот это

    Obsha9 kodfio = _db.Obsha9.Find(kod);

    может быть стоит внести в скобку с проверкой на null.
    • Изменено INFEL8 29 мая 2013 г. 19:52
  • так уже лучше 1 строчку удалить получилось, используя

    public ActionResult Delete(int? kod)
    {
      // Ваш код
    }

      вторую выдал вот что

    Ошибка сервера в приложении '/'.

    Значение не может быть неопределенным.
    Имя параметра: entity

    Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

    Сведения об исключении: System.ArgumentNullException: Значение не может быть неопределенным.
    Имя параметра: entity

    Ошибка источника:

    Строка 50:             if (kod != null)
    Строка 51:             {
    Строка 52:                 _db.Obsha9.Remove(kodfio);
    Строка 53:                 _db.SaveChanges();
    Строка 54:             }


    Исходный файл: c:\Users\Евгений\Documents\Visual Studio 2012\Projects\ReitingTeacher\ReitingTeacher\Controllers\HomeController.cs    Строка: 52

    причем странно когда я меняю значение переменной код в    @Html.ActionLink("Удалить", "Delete", new { id= c.KodFIO, kod= 10 })

    удалить получается только 1 строчку на всех остальных вылезает ошибка и

    удаляет не выбранную строку, а ту с которой совпадает значение поля KOD в бд со значением KOD в акшенлинке... @Html.ActionLink("Удалить", "Delete", new { id= c.KodFIO, kod= 10 })


    • Изменено EvgeniyO 29 мая 2013 г. 23:30
  • Так может там просто что у Вас во втором случае kodfio получается как null.

    Вдруг не находит, да и что-то null то точно получается (мне отсюда не видно).
    Попробуйте так, вдруг и правда по коду 2-й строчки не получилось найти kodfio:

    Obsha9 kodfio = _db.Obsha9.Find(kod); if (kod != null) { if(kodfio != null) { _db.Obsha9.Remove(kodfio); _db.SaveChanges(); }

    // всё, что осталось

    }




    • Изменено INFEL8 30 мая 2013 г. 4:19
  • Вы проверяете один параметр, а вставляете совсем другой, который ничего не содержит. Это делать бессмысленно. Поэтому и вылетает исключение.

    Строка 50:             if (kod != null)
    Строка 51:             {
    Строка 52:                 _db.Obsha9.Remove(kodfio);
    Строка 53:                 _db.SaveChanges();
    Строка 54:             }

    Модератор
  • нет в общем все не так, все не то

    Строка 50: if (kod != null) Строка 51: { Строка 52: _db.Obsha9.Remove(kodfio); Строка 53: _db.SaveChanges(); Строка 54: }
    это все поменял на поле код, результат тот же, вывод не важно

    по каким полям привязка,

    @Html.ActionLink("Удалить", "Delete", new { id= c.Kod, kod= 10 })

    - удаление происходит только по определенному значению kod, например = 10,

    я нажму "удалить" и он найдет строку где в столбце kod, равен 10 и удалит ее.

    остальные как удалять без изменения значения в  

    @Html.ActionLink("Удалить", "Delete", new { id= c.KodFIO, kod= 10 }).

    И еще поле kodfio, так же как и kod в базе notnull, Kod еще и PK.



    • Изменено EvgeniyO 30 мая 2013 г. 7:26
    • Изменено YatajgaEditor 31 мая 2013 г. 5:52 Форматирование
  • проблема решена проще чем ожидалось 
     public ActionResult Delete(int? kod1)
            {
                Obsha9 kod = _db.Obsha9.Find(kod1);
    
                if (kod != null)
                {
                    _db.Obsha9.Remove(kod);
                    _db.SaveChanges();
                }
                return RedirectToAction("Index");

    @Html.ActionLink("Удалить", "Delete", new { id= c.Kod, kod1=c.Kod})

  • но теперь нарисовалась другая проблема, когда  делаю  тоже самое для других таблиц выдает вот что) 

    Ошибка сервера в приложении '/'.

    Не удалось найти данный ресурс.

    Описание: HTTP 404. Возможно, искомый ресурс (или один из зависимых от него компонентов) удален, получил другое имя или временно недоступен.  Просмотрите следующий URL-адрес и проверьте, что он введен правильно.

    Запрошенный URL: /AddJob/Delete/10006


    Информация о версии: Платформа Microsoft .NET Framework, версия:4.0.30319; ASP.NET, версия:4.0.30319.17929 
  • У вас ссылка ведёт на страницу 10006. Я так понимаю, что 10006 это параметр? 

    Ещё раз советую прочитать тут. У вас станет на порядок меньше вопросов! 

    P.S. Названия классов, переменных делайте более удобочитаемыми и логичными с содержательной точки зрения.

  • Ну развезли тут цирк))

    1 посмотри в свой роутинг - там скорее всего увидишь чтото типа такого
    "{controller}/{action}/{id}"

    так вот id тут ключевое

    и у тебя передается в твой метод id=12345/*kod*/, а метод не принимает id а принимает kod

    соответственно либо тут исправь

    @Html.ActionLink("Удалить", "Delete", new { kod= c.KodFIO }) и добавь роутинг с "{controller}/{action}/{kod}"

    либо тут исправь
    public ActionResult Delete(int id)
            {
                Obsha9 kodfio = _db.Obsha9.Find(id);
               // if (id != null)
               // {
                    _db.Obsha9.Remove(id);
                    _db.SaveChanges();
                //}
                return RedirectToAction("Index");


    P.S. с исправлением роутинга так неполучится "{controller}/{action}/{kod}" - конфликт пойдет c id
    в общем запомни что существует связь по именам которую нужно соблюдать - если в ссылке стоит id значит и в методе должен стоять id а не int yaSralNaEtoPravilo