Felhasználói adatok frissítésének problémája

Felhasználói adatok frissítésének problémája
2012-05-02T12:01:46+02:00
2012-05-02T14:26:26+02:00
2022-11-25T14:02:43+01:00
cofoska
Sziasztok!

A probléma a következő lenne adott egy bejelentkezési regisztrációs felület, rendben működnek. Mikor viszont a felhasználó az adatlapján modosítani szeretne nemtud valamiért nem változtatja meg.

My_Profile.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/design.master" AutoEventWireup="true" CodeFile="My_Profile.aspx.cs" Inherits="My_Profile" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> <style type="text/css"> .style3 { width: 350px; } .style4 { width: 134px; } </style> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <p> &nbsp;</p> <p> <table class="style3"> <tr> <td class="style4"> Felhasználói név:</td> <td> <asp:TextBox ID="txtbox_name" runat="server" Width="150px"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator8" runat="server" ControlToValidate="txtbox_name" ErrorMessage="Kitöltése kötelező" ValidationGroup="requireddatas">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td class="style4"> Számlázási cím:</td> <td> <asp:TextBox ID="txtbox_city" runat="server" Width="150px"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtbox_city" ErrorMessage="Nem adott meg számlázi címet, kérem pótolja!" ValidationGroup="requireddatas">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td class="style4"> Számlázási név:</td> <td> <asp:TextBox ID="txtbox_ugyfel" runat="server" Width="150px"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtbox_ugyfel" ErrorMessage="Nem adott meg számlázási nevet, kérjük pótolja!" ValidationGroup="requireddatas">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td class="style4"> E-mail:</td> <td> <asp:TextBox ID="txtbox_mail" runat="server" Width="150px"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="txtbox_mail" ErrorMessage="Kérem adjon meg egy e-mail címet" ValidationGroup="requireddatas">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td class="style4"> Telefonszám:</td> <td> <asp:TextBox ID="txtbox_telefon" runat="server" Width="150px"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ControlToValidate="txtbox_telefon" ErrorMessage="Kérem adjon meg egy Telefonszámot!" ValidationGroup="requireddatas">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td class="style4"> Bankszámlaszám:</td> <td> <asp:TextBox ID="txtbox_szamla" runat="server" Width="150px"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server" ControlToValidate="txtbox_szamla" ErrorMessage="Bankszámlaszám megadása kötelező!" ValidationGroup="requireddatas">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td class="style4"> Születési idő:</td> <td> <asp:TextBox ID="txtbox_date" runat="server" Width="150px"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator7" runat="server" ControlToValidate="txtbox_date" ErrorMessage="Kérem adja meg a születési dátumát!" ValidationGroup="requireddatas">*</asp:RequiredFieldValidator> </td> </tr> </table> </p> <p> &nbsp;</p> <p> <asp:Button ID="Button1" runat="server" Text="Mentés" onclick="Button1_Click" ValidationGroup="requireddatas" /> </p> <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" /> <p> &nbsp;</p> </asp:Content>

A mögötes kód:
My_Profile.aspx.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class My_Profile : System.Web.UI.Page { protected void Page_PreInit(object sender, EventArgs e) { } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { MembersDataContext mdc = new MembersDataContext(); IQueryable<member> mems; member mem = new member(); mems = from m in mdc.members where m.Nickname == User.Identity.Name select m; mem = mems.First(); txtbox_name.Text = mem.Nickname; txtbox_name.DataBind(); txtbox_city.Text = mem.City; txtbox_city.DataBind(); txtbox_ugyfel.Text = mem.Ugyfel; txtbox_ugyfel.DataBind(); txtbox_telefon.Text = mem.Telefon; txtbox_telefon.DataBind(); txtbox_szamla.Text = mem.Bankszamla; txtbox_szamla.DataBind(); txtbox_mail.Text = mem.Mail_Address; txtbox_mail.DataBind(); txtbox_date.Text = mem.Born_Date.ToShortDateString(); txtbox_date.DataBind(); } } protected void Button1_Click(object sender, EventArgs e) { string name = txtbox_name.Text; string city = txtbox_city.Text; string ugyfel = txtbox_ugyfel.Text; string telefon = txtbox_telefon.Text; string szamla = txtbox_szamla.Text; string mail = txtbox_mail.Text; DateTime date = Convert.ToDateTime(txtbox_date.Text); MembersDataContext mdc = new MembersDataContext(); IQueryable<member> mems; member mem = new member(); mems = from m in mdc.members where m.Nickname == User.Identity.Name.ToString() select m; mem = mems.First(); mem.Nickname = name; mem.City = city; mem.Ugyfel = ugyfel; mem.Telefon = telefon; mem.Bankszamla = szamla; mem.Mail_Address = mail; mem.Born_Date = date; } } A biztonság kedvéért felraktam az egész alkalmazást is: Data.hu

Valamiért nem frissülnek a felhasználó adatai az adatlapján. Előre is köszi a segítséget. Ez az első segítségkérésem előre is bocsi ha nem jó a formális leírás.
Mutasd a teljes hozzászólást!
Sőt, teljesen fölösleges egy új példányt létrehozni először, hogy azután felülírjuk a lekérdezésből kiválasztott példánnyal.

Ezen kívül az
User.Identity.Name
már eleve string típus, így nem nagyon kell még egyszer string-gé konvertálni.

Így a tovább finomított változat:

protected void Button1_Click(object sender, EventArgs e) { string name = txtbox_name.Text; string city = txtbox_city.Text; string ugyfel = txtbox_ugyfel.Text; string telefon = txtbox_telefon.Text; string szamla = txtbox_szamla.Text; string mail = txtbox_mail.Text; DateTime date = Convert.ToDateTime(txtbox_date.Text); MembersDataContext mdc = new MembersDataContext(); member mem = (from m in mdc.members where m.Nickname == User.Identity.Name select m).Single(); mdc.members.Attach(mem); mem.Nickname = name; mem.City = city; mem.Ugyfel = ugyfel; mem.Telefon = telefon; mem.Bankszamla = szamla; mem.Mail_Address = mail; mem.Born_Date = date; mdc.SubmitChanges(); }
Mutasd a teljes hozzászólást!

  • Helló!

    Szerintem szükség lenne egy Attach-ra és egy mentésre.

    MembersDataContext mdc = new MembersDataContext(); var mems = from m in mdc.members where m.Nickname == User.Identity.Name.ToString() select m; member mem = mems.First(); mdc.members.Attach(mem); mem.Nickname = name; mem.City = city; mem.Ugyfel = ugyfel; mem.Telefon = telefon; mem.Bankszamla = szamla; mem.Mail_Address = mail; mem.Born_Date = date; mdc.SaveChanges();

    Még egy dolog: First() helyett talán célszerű a Single()-t használni, mivel a First() több rekordból adja vissza az elsőt, míg a Single() pontosan egy rekordot vár és exception-t dob, ha nem pontosan egyet kap.

    Tehát:

    member mem = mems.Single();
    Mutasd a teljes hozzászólást!
  • Szia

    A következő hibára fut:
    Leírás: Hiba történt a kérelem kiszolgálásához szükséges erőforrás fordítása során. Ellenőrizze a hiba alább látható részletes leírását, és annak megfelelően módosítsa a forráskódot.

    A fordítóprogram hibaüzenete: CS0128: Ebben a hatókörben már definiálva van "mem" nevű lokális változó.

    Forráshiba:


    52. sor: where m.Nickname == User.Identity.Name.ToString()
    53. sor: select m;
    54. sor: member mem = mems.Single();
    55. sor:
    56. sor: mdc.members.Attach(mem);


    Visual studio ezeket a hibaüzeneteket jelzi:

    Error 1 Ebben a hatókörben már definiálva van "mem" nevű lokális változó. C:\adatlaptot\My_Profile.aspx.cs 54 16 C:\adatlaptot\

    Error 2 "MembersDataContext" nem tartalmazza a(z) "SaveChanges" metódus definícióját, és nem található olyan "SaveChanges" kiterjesztésmetódus, amely "MembersDataContext" típusú első argumentumot fogad el (esetleg hiányzik egy "using" direktíva vagy egy hivatkozás egy szerelvényre). C:\adatlaptot\My_Profile.aspx.cs 66 13 C:\adatlaptot\


    Van rá ötleted mi lehet még vele? Amúgy köszi hogy foglalkozol a kérdéssel.

    Feldobtam a teljes alkalmazást egy rar-ba.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Valószínűleg régebbi EF-et használsz, így próbáld ezt a mentéshez:

    mdc.SubmitChanges();

    Teljes metódus:

    protected void Button1_Click(object sender, EventArgs e) { string name = txtbox_name.Text; string city = txtbox_city.Text; string ugyfel = txtbox_ugyfel.Text; string telefon = txtbox_telefon.Text; string szamla = txtbox_szamla.Text; string mail = txtbox_mail.Text; DateTime date = Convert.ToDateTime(txtbox_date.Text); MembersDataContext mdc = new MembersDataContext(); var mems = from m in mdc.members where m.Nickname == User.Identity.Name.ToString() select m; member mem = mems.First(); mdc.members.Attach(mem); mem.Nickname = name; mem.City = city; mem.Ugyfel = ugyfel; mem.Telefon = telefon; mem.Bankszamla = szamla; mem.Mail_Address = mail; mem.Born_Date = date; mdc.SubmitChanges(); }
    Mutasd a teljes hozzászólást!
  • member mem = new member();

    member mem = mems.Single();

    Ha így szerepel, akkor tényleg üti egymást a kettő, mert kétszer definiálod a mem változót.

    Másodjára elég lenne:

    mem = mems.Single();
    Mutasd a teljes hozzászólást!
  • Sőt, teljesen fölösleges egy új példányt létrehozni először, hogy azután felülírjuk a lekérdezésből kiválasztott példánnyal.

    Ezen kívül az
    User.Identity.Name
    már eleve string típus, így nem nagyon kell még egyszer string-gé konvertálni.

    Így a tovább finomított változat:

    protected void Button1_Click(object sender, EventArgs e) { string name = txtbox_name.Text; string city = txtbox_city.Text; string ugyfel = txtbox_ugyfel.Text; string telefon = txtbox_telefon.Text; string szamla = txtbox_szamla.Text; string mail = txtbox_mail.Text; DateTime date = Convert.ToDateTime(txtbox_date.Text); MembersDataContext mdc = new MembersDataContext(); member mem = (from m in mdc.members where m.Nickname == User.Identity.Name select m).Single(); mdc.members.Attach(mem); mem.Nickname = name; mem.City = city; mem.Ugyfel = ugyfel; mem.Telefon = telefon; mem.Bankszamla = szamla; mem.Mail_Address = mail; mem.Born_Date = date; mdc.SubmitChanges(); }
    Mutasd a teljes hozzászólást!
  • Jogos.

    Amúgy nem lenne praktikusabb inkább a SingleOrDefault() használata, ha nincs hibakezelés a Single()-re ?
    Mutasd a teljes hozzászólást!
  • Ez szituációtól függ.

    Esetünkben a frissítés kizárólag akkor történhet meg, ha létezik ilyen felhasználó. Tehát nem célszerű a
    SingleOrDefault()
    -ot használni, hiszen annak van eredménye, ha nem létezik a rekord.

    Szerintem itt dobjon csak exception-t, ha nem létezik a rekord.

    (Itt semmilyen hibakezelés nincs, de az más tészta.)
    Mutasd a teljes hozzászólást!
  • Szia

    Erre modosítottam a leírtak alapján a My_Profile.aspx.cs filét:

    protected void Page_PreInit(object sender, EventArgs e) { } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { MembersDataContext mdc = new MembersDataContext(); IQueryable<member> mems; member mem = new member(); mems = from m in mdc.members where m.Nickname == User.Identity.Name select m; mem = mems.First(); txtbox_name.Text = mem.Nickname; txtbox_name.DataBind(); txtbox_city.Text = mem.City; txtbox_city.DataBind(); txtbox_ugyfel.Text = mem.Ugyfel; txtbox_ugyfel.DataBind(); txtbox_telefon.Text = mem.Telefon; txtbox_telefon.DataBind(); txtbox_szamla.Text = mem.Bankszamla; txtbox_szamla.DataBind(); txtbox_mail.Text = mem.Mail_Address; txtbox_mail.DataBind(); txtbox_date.Text = mem.Born_Date.ToShortDateString(); txtbox_date.DataBind(); } } protected void Button1_Click(object sender, EventArgs e) { string name = txtbox_name.Text; string city = txtbox_city.Text; string ugyfel = txtbox_ugyfel.Text; string telefon = txtbox_telefon.Text; string szamla = txtbox_szamla.Text; string mail = txtbox_mail.Text; DateTime date = Convert.ToDateTime(txtbox_date.Text); MembersDataContext mdc = new MembersDataContext(); member mem = (from m in mdc.members where m.Nickname == User.Identity.Name select m).Single(); mdc.members.Attach(mem); mem.Nickname = name; mem.City = city; mem.Ugyfel = ugyfel; mem.Telefon = telefon; mem.Bankszamla = szamla; mem.Mail_Address = mail; mem.Born_Date = date; mdc.SubmitChanges(); } } Bejön ugye a My_Profil.aspx valamit változtatok rámegyek a mentésre a következőt dobja ki:
    Kiszolgálóhiba történt az alkalmazásban: "/adatlaptot". Nem csatolható olyan entitás, amely már létezik. Leírás: Nem kezelt kivétel következett be az aktuális webes kérelem végrehajtása során. A hibára és az azt okozó kódrészletre vonatkozó adatok az alábbi veremkivonatban találhatók. Kivétel adatai: System.InvalidOperationException: Nem csatolható olyan entitás, amely már létezik. Forráshiba: A nem kezelt kivételt okozó forráskód csak akkor jeleníthető meg, ha fordítása hibakeresési módban történt. Ennek bekapcsolásához hajtsa végre az alábbi műveletek egyikét, majd keresse fel az URL-címet: 1. A hibát okozó fájl elején helyezze el a "Debug=true" direktívát. Példa:   <%@ Page Language="C#" Debug="true" %> vagy: 2. Helyezze el a következő szakaszt az alkalmazás konfigurációs fájljában: <configuration>    <system.web>        <compilation debug="true"/>    </system.web> </configuration> Megjegyzés: A második módszer használatakor a rendszer az alkalmazás valamennyi fájlját hibakeresési módban fordítja le. Az első módszert választva csak az adott fájl lesz hibakeresési módban fordítva. Fontos: Az alkalmazások hibakeresési módban történő futtatása több memóriát igényel, ez csökkenti a teljesítményt. Ügyeljen arra, hogy az üzemi környezetbe való telepítés előtti fordításkor ki legyen kapcsolva a hibakeresés. Veremkivonat: [InvalidOperationException: Nem csatolható olyan entitás, amely már létezik.]    System.Data.Linq.Table`1.Attach(TEntity entity, Boolean asModified) +800803    System.Data.Linq.Table`1.Attach(TEntity entity) +17    My_Profile.Button1_Click(Object sender, EventArgs e) +571    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
    
    Mi lehet még a gondja a forrásnak?
    Bocsi tényleg a fárasztásért, és köszönet a segítségért.
    Mutasd a teljes hozzászólást!
  • Tedd bele a web.config-ba, amit javasol, hogy látszódjon a probléma:

    <configuration> <system.web> <compilation debug="true"/> </system.web> </configuration>

    Valamint debugold meg, hogy hol akad el.

    Ezt hívják fejlesztésnek.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd