[ASP.net MVC / C#] Delete action werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10
Hoi allemaal,

Ik heb een heel simpel MVC projectje met een database met het Entity framework
Nu wil het zo zijn dat als ik een delete action maak mijn delete niet werkt. de get action van de delete geeft netjes een Object aan de hand van een id

C#:
1
2
3
4
5
6
7
8
public ActionResult Delete(int id)
        {
            var productgroupToDelete = (from p in _entities.Productgroup
                                   where p.productgroupID == id
                                   select p).FirstOrDefault();

            return View(productgroupToDelete);
        }


maar de post action doet echter helemaal niets,
en geeft een NullReferenceException

HTML:
1
2
3
4
5
6
7
8
9
<h2>
        Delete</h2>
    <p>
        Are you sure you want to delete the productgroup
        Puhh?</p>
    <form action="/Productgroup/Delete/6" method="post">
    <p>
        <input type="submit" value="Delete" /></p>
    </form>


Hierboven het relevante html source als de get verstuurd is. Hier staat netjes een action met een id als ik het zo bekijk.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Delete(Productgroup productgroupToDelete)
        {
            try
            {
                var originalProductgroup = (from p in _entities.Productgroup
                                       where p.productgroupID == productgroupToDelete.productgroupID
                                       select p).FirstOrDefault();

                _entities.DeleteObject(originalProductgroup);
                _entities.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }


Als ik daarna in mijn post action kijk van de delete is productgroupToDelete echter helemaal leeg.
Ik weet alleen niet waarom deze niet gevuld wordt en hoop dat iemand mij hiermee kan helpen.

Ik ben nog erg nieuw met MVC en entity framework dus zal wel een stomme fout zijn die ik over het hoofd zie.

hieronder ook nog even mijn Delete view
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<FRSTestPortal.Models.Productgroup>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Delete
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Delete</h2>
    <p>
        Are you sure you want to delete the productgroup
        <%= Model.productgroupName %>?</p>
    <% using (Html.BeginForm(new { id = Model.productgroupID }))
       { %>
    <p>
        <input type="submit" value="Delete" /></p>
    <% }%>
    <div>
        <%=Html.ActionLink("Back to List","Index") %>
    </div>
</asp:Content>


Ik heb voor zover ik weet alles goed gedaan maar kom er echt niet meer uit..

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Op de eerste Delete moet je filteren op de HttpVerbs.Get en bij de tweede delete moet je ook 'int id' als argument gebruiken (6 in het voorbeeld), echter dan als post. Welke overloaded Delete wordt gebruikt wordt dus dan bepaald aan de hand van de http verb.

Nu kan MVC niet 6 omzetten naar Productgroup en geeft deze dus 'null' door.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Rockafello
  • Registratie: Maart 2005
  • Laatst online: 27-12-2023
Overigens lijkt me dit niet verstandig voor een delete:

code:
1
2
3
var originalProductgroup = (from p in _entities.Productgroup
                                       where p.productgroupID == productgroupToDelete.productgroupID
                                       select p).FirstOrDefault();


die FirstOrDefault zou ik hier weghalen. En eerst kijken of je maar 1 record

code:
1
2
3
4
5
6
7
8
var originalProductgroup = (from p in _entities.Productgroup
                                       where p.productgroupID == productgroupToDelete.productgroupID
                                       select p); 

if (originalProductgroup .Count() > 0)
                return originalProductgroup .First();
            else
                return null;

Voor hetzelfde geld pakt ie de verkeerde, maar dit weet ik niet zeker

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Rockafello schreef op donderdag 23 juli 2009 @ 13:58:
Overigens lijkt me dit niet verstandig voor een delete:

code:
1
2
3
var originalProductgroup = (from p in _entities.Productgroup
                                       where p.productgroupID == productgroupToDelete.productgroupID
                                       select p).FirstOrDefault();


die FirstOrDefault zou ik hier weghalen. En eerst kijken of je maar 1 record

code:
1
2
3
4
5
6
7
8
var originalProductgroup = (from p in _entities.Productgroup
                                       where p.productgroupID == productgroupToDelete.productgroupID
                                       select p); 

if (originalProductgroup .Count() > 0)
                return originalProductgroup .First();
            else
                return null;

Voor hetzelfde geld pakt ie de verkeerde, maar dit weet ik niet zeker
Maar de FirstOrDefault() doet precies wat jij nu handmatig wilt doen. Als er geen record is wordt een null value terug gegeven. Zou je op de query (zonder count() controle) direct First gebruiken en de record niet bestaan in de database, dan krijg je een exceptie. Ofwel als er geen First() is, dan geeft Linq Default(ENTITY) terug. Default wordt vooral gebruikt in code met generics.

Default(int) geeft 0
Default(ProductGroup) geeft null

In beide gevallen moet de aanroepende code nog steeds controleren of je een entity terug wordt gegeven of een null value.

If it isn't broken, fix it until it is..