Hirdetés

2024. június 6., csütörtök

Gyorskeresés

Hozzászólások

(#8601) martonx válasza lord.lakli (#8595) üzenetére


martonx
veterán

Pedig de. Kivételek nyilván lehetnek, de azok csak erősítik a szabályt.

Én kérek elnézést!

(#8602) kingabo


kingabo
őstag

Svéd kódban volt rengeteg "apa" nevű változó és "igen" komment. :DDD
(apa == majom, igen == újra / még 1*) ;)

(#8603) amdni


amdni
aktív tag

Üdv!

Hogyan lehet megoldani, hogy c#-ban generikus értékre működjön pl. az + (összeadás) operátor?
class Node<T>
{
public T value;
public Node<T> next;
public Node<T> prev;

public static Node<T> operator +(Node<T> a, Node<T> b)
{
return a.value + b.value;
}
}

Ez sajnos nem működik.
Köszönöm a segítséget!

(#8604) petyus_ válasza amdni (#8603) üzenetére


petyus_
senior tag

Ezt ilyen egyszerűen nem lehet megoldani, itt találsz pár megoldást.

(#8605) amdni válasza petyus_ (#8604) üzenetére


amdni
aktív tag

Eddig már eljutottam, de valami hiba van:
Egyébként egy kérirányú lálncolt listában kellene egy függvényt írom, ami az átlagot kiszámolja.
De a függvénynek a láncolt listában kell lennie, nem a program.cs-ben.

class Node<T>
{
public T value;
public Node<T> next;
public Node<T> prev;

public static T operator +(Node<T> x, Node<T> y)
{
return (dynamic)x.value + y.value;
}

}

public T Atlag()
{
Node<T> tempValue = new Node<T>();
Node<T> temp = start;
while (temp != null)
{
tempValue = tempValue + temp;
}
return tempValue.value;
}

(#8606) petyus_ válasza amdni (#8605) üzenetére


petyus_
senior tag

A hiba ott van. hogy tempvalue + temp T-t ad vissza, tempValue nem lehet egyenlő a kettő összegével. Írd át tempValue.Value = -ra.

Amúgy osztásnál megint lesz egy kis problémád, megszámolod hány elemből áll a lista, de az egy int lesz, azzal nem fogod tudni osztani a tempValue-t a végén (tempValue.Value-t sem), úgyhogy kell majd egy Node<T> / int overload (nem biztos, hogy pont így ahogy írom, sajnos nincs most időm jobban ránézni).

[ Szerkesztve ]

(#8607) amdni válasza petyus_ (#8606) üzenetére


amdni
aktív tag

Próbáltam úgy, szintaktikailag nem jelzett hibát a visual studio, de a program nem futott le, egy exeption-an megállt.

Végülis én 2 db T típusú adatot szeretnék összeadni.

class Node<T>
{
public T value;
public Node<T> next;
public Node<T> prev;

public static T operator +(T x, T y)
{
return (dynamic)x + y;
}

}

(#8608) amdni


amdni
aktív tag

Ez a legújabb verzióm: :)

public static Node<T> operator +(Node<T> x, Node<T> y)
{
return (dynamic)x.value + y.value;
}

public T Szum()
{
Node<T> tempValue = new Node<T>();
Node<T> temp = start;
while (temp != null)
{
tempValue = temp + tempValue;
temp = temp.next;
}
return tempValue.value;
}

Ez a hibaüzenet: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'A(z) „int” – „Node<int>” implicit típuskonverzió nem lehetséges.'

[ Szerkesztve ]

(#8609) amdni


amdni
aktív tag

Sajnos még mindig nem tudom megoldani a problémát.
Valaki esetleg tudna ebben segíteni?
Ha c#-ban egy generikus étrékkel szeretnék aritmetikai műveletet végezni pl. összeadást, hogyan tudom megoldani?
Valójában egy láncolt listába szeretnék írni egy függvényt, ami a láncolt lista átlagát adja meg. És a lálcolt lista generikus.

(#8610) I02S3F válasza amdni (#8609) üzenetére


I02S3F
őstag

Nem vagyok azon a szinten, hogy tudjak érdemben segíteni, de angolul tudsz? Google-el utána néztél már? Stackoverflow-n biztos van hasonló probléma megoldással. Ha mást nem bontsd le kis feladatokra és azokra keress megoldást. Vagy túl kézenfekvő amit írok és túl vagy már ezeken? :R

Szerk.: A másik megoldásnak az olvasást gondolom. Elolvashatod a használni kívánt komponensek dokumentációját, nézhetsz hozzá példákat. (Ez esetben el kell engedned azt, hogy szűkös határidőre elkészülsz).

[ Szerkesztve ]

(#8611) amdni válasza I02S3F (#8610) üzenetére


amdni
aktív tag

Nem gondoltam hogy ennyire bonyolult lenne ez a dolog. Már jó pár angol leírást olvastam, de esetemben nem működött a dolog.

(#8612) amdni


amdni
aktív tag

Megoldódott :) :

public static T operator +(Node<T> x, Node<T> y)
{
return (dynamic)x.value + y.value;
}

public static T operator /(Node<T> x, int y)
{
return (dynamic)x.value / y;

}

public Node<T> Sum()
{
Node<T> ertek = new Node<T>();
Node<T> temp = start;
while (temp != null)
{
ertek.value = ertek + temp;
temp = temp.next;
}
return ertek;
}

public T Atlag()
{
T vissza;
vissza = Sum() / count;
return vissza;

(#8613) Zalanius válasza amdni (#8609) üzenetére


Zalanius
tag

Ez nem pont a keresett megoldás lesz, de miközben olvastam a kódodat, eszembe jutott pár dolog. Például van már létező osztály kétszeres láncolt listára, és extension methodokkal simán számol átlagot is minden egyéb nélkül. De ha valamit mélyebben berhelni kell, az sem probléma, példaként ott egy customsum. Dividebyzeroval most nem vacakoltam.

class Program
{
static void Main(string[] args)
{
int[] costs = new int[] { 10, 20, 1 };
var linkedcosts = new MyList<int>(costs);
int costsum = linkedcosts.CustomSum();
double costavg = costsum / (double)linkedcosts.Count;
int costsum2 = linkedcosts.Sum();
double costavg2 = linkedcosts.Average();

string[] names = new string[] { "Gips", "Jacob" };
var linkednames = new MyList<string>(names);
string namessum = linkednames.CustomSum();
string namessum2 = linkednames.Aggregate("", (c, n) => c + n);
Console.ReadKey();
}
}

class MyList<T> : LinkedList<T>
{
public MyList() : base()
{
}
public MyList(IEnumerable<T> collection) : base(collection)
{
}

public T CustomSum()
{
T sum = default(T);
if (First == null)
{
return sum;
}
sum = First.Value;
LinkedListNode<T> temp2 = First.Next;
while (temp2 != null)
{
sum += (dynamic)temp2.Value;
temp2 = temp2.Next;
}
return sum;
}
}

szerk. megoldódott látom, így végül is offtopicnak is tárgytalan, de itt hagyom, hátha segít még vmit.

[ Szerkesztve ]

--= Zalán =--

(#8614) Peter Kiss válasza amdni (#8612) üzenetére


Peter Kiss
senior tag
LOGOUT blog

Nem oldódott meg semmi, csak még több bajt csinálsz, bármi is legyen a feladat.

(#8615) martonx válasza amdni (#8612) üzenetére


martonx
veterán

Nekem valami architekturális hibának tűnik ez az egész, ahogy próbálsz fából vaskarikát csinálni. Én a helyedben inkább az egész megoldást újra gondolnám, mintsem, hogy a falat törjem a zsákutca végében.

Én kérek elnézést!

(#8616) I02S3F válasza martonx (#8615) üzenetére


I02S3F
őstag

Ez lett volna a másik ötletem!(hogy gondolja újra a megoldást)

[ Szerkesztve ]

(#8617) joysefke


joysefke
veterán
LOGOUT blog

Sziasztok!

ASP.NET Core 2.1 MVC

Layout+View+ViewComponent témakörben kéne egy kis help. Sehogy nem tudom szépen megoldani amit szeretnék.

Tehát a user számára renderelt View tartalmaz egyrészt képeket, style-t (háttér-kép, általános szövegek, kedvcsinálók stb) illetve tartalmaz ezen felül a user-hez kapcsolódó adatokat is, amelyek egy form-ban kerülnek megjelenítésre (HttpGet), illetve onnan lesznek updatelve (HttpPost).

A kétféle adatot szeretném elválasztani, úgy, hogy:
-A parent View-nak (parent View == Index.cshtml) átadott ViewModel objektum kizárólag a user-hez kapcsolódó adatokat tartalmazza, ami a form-hoz hozzá is lesz kötve.
-A formázás, háttérkép, csicsa-micsát pedig egy az Index.cshtml-ből hívott ViewComponent (PageContentViewComponent.cs) által renderelt partial View tartalmazza (Default.cshtml). A ViewComponent ezeket az adatokat DI-al nyeri ki a content-repository-ból.

Ami nem megy:
A Layout-ban hivatkozom néhány RenderSection-re, pld @RenderSection("Title"). Ezt a sectiont nem a View-ban, hanem a View által hívott ViewComponentben szeretném legenerálni.

Tehát Layout-ban ez van:
......
@RenderSection("Title")
.....
.....
@RenderBody() <---- Ez szépen működik

Az Index.cshtml-ben ez van:
........
@await Component.InvokeAsync("PageContent")

A PageContentViewComponent-hez tartozó Default.cshtml-ben az alábbiak vannak. A kérdéses section legalul van.

@model UIModel

<div class="div">

......
@await Html.PartialAsync("NavbarPartial", Model)

@await Html.PartialAsync("CouplePartial", Model.Couple)

@await Html.PartialAsync("EventsPartial", Model.Events)

@await Html.PartialAsync("PeoplePartial", Model.People)

@await Html.PartialAsync("GalleryPartial", Model.Gallery)
....
</div>

@section Title{
<title>@Model.General.Title</title>
}

Erre ezt kapom:
InvalidOperationException: The layout page '/Views/Shared/_PrettyLayout.cshtml' cannot find the section 'Title' in the content page '/Views/Ui/Index.cshtml'.

[ Szerkesztve ]

(#8618) martonx válasza joysefke (#8617) üzenetére


martonx
veterán

Szia,

Előre bocsátom, hogy nem tudom megoldani a problémádat, csak rá szeretnék világítani az újabb kódszervezési problémákra, overengineering jelenségre.

"-A formázás, háttérkép, csicsa-micsát pedig egy az Index.cshtml-ből hívott ViewComponent (PageContentViewComponent.cs) által renderelt partial View tartalmazza (Default.cshtml)."

Erre a Layout.cshtml való. Azért is pont Layout a neve :) Javaslom ne bonyolítsd túl feleslegesen a kódodat. Hidd el, nem attól lesz szép a kódod, hogy a kereket kézben viszed, a szögleteset meg gurítani akarod.

Én kérek elnézést!

(#8619) joysefke válasza martonx (#8618) üzenetére


joysefke
veterán
LOGOUT blog

csak rá szeretnék világítani az újabb kódszervezési problémákra, overengineering jelenségre.

Ezek a "képek, formázások, csicsa-micsa" repositoriból jönnek, mert admin által konfigurálhatóak. Emiatt én úgy gondolom, hogy ezeknek a dinamikus elemeknek az előteremtése és renderelése jól illeszkedik egy ViewComponentbe. Ez saját hatáskörében előteremti ezeket. Így a ViewComponent felszabadítja parent View (Index.cshtml) a ViewModel objektumotát, hogy annak kizárólag a Html-Form feltöltésével és kelljen foglalkoznia.

Szerintem ez a konstrukció logikus és jól kezelhető is. A döntő többsége, minden ami a @RenderBody()-ból jön működik is. A problémám hogy amit @RenderSection()-nel akarok beilleszteni a Layout-ba, na az nem működik. Gyanítom, hogy a megoldás nagyon kézenfekvő annak aki nálam jobban benne van a Razor-ban (ez utóbbi nem nagy feladat).

Javaslom ne bonyolítsd túl feleslegesen a kódodat. Hidd el, nem attól lesz szép a kódod, hogy a kereket kézben viszed, a szögleteset meg gurítani akarod.

Ha esetleg van kedved rávilágítani azokra a pontokra ahol szerinted a kereket kézben viszem, a szögletest pedig gurítani akarom, akkor szívesen megosztom a kódnak a releváns részeit és ha van rá jobb ötleted én biztosan kijavítom... ;)

[ Szerkesztve ]

(#8620) martonx válasza joysefke (#8619) üzenetére


martonx
veterán

Attól még, hogy repositoryból jönnek (felmerül a kérdés, kell-e repository patternt alkalmazni? sokszor csak egy rossz beidegződés, és felesleges bonyolítás), simán ott lehetne a Layout.cshtml-ben, hiszen ezek oda valóak, a Layout részei.
Aztán persze a Layout-on belül hozhatsz létre plusz RenderSection-öket, amiket utána úgy használsz az egyéb view-idban, ahogy jól esik.
Illetve a Layoutban is lehet Partial view-kat használni.
Egyszerűen, ami a Layoutba való, az legyen ott, ne pedig ilyen olyan eldugott komponensekben. Hidd el X év múlva amikor visszanézed és keresed, hogy XY rész hogy renderelődött oda, vért fogsz izzadni és átkozni fogod magad. Ahelyett, hogy ott sorakoznának a _Partial.cshtml-ek, normális nevezéktannal, szépen átláthatóan, hogy melyik mit csinál.
Partial view-t controllerből is ki tudsz generálni, és úgy beszúrni a parent view-ba, ezáltal a logikákat még szebben tovább tudod szeparálni.
És igen, az Index.cshtml-ed foglalkozzon csak a form feltöltésével, egyszerűen némi RenderSection, és normális partial view architektúra helyett, jelenleg érzésre össze vissza toldozod-foltozod a szerencsétlen rendszert.

Én kérek elnézést!

(#8621) joysefke


joysefke
veterán
LOGOUT blog

A föntire még visszatérünk :)

ASP Identity, Authentication

Sziasztok!

Az oldal látogatói rendelkezni fognak egy-egy egyedi linkkel:
www.myawsomesite.cheapdomain.com/[B]fw8o7i[/B]

A vastagon szedett szegmens azonosítja a usert, userenként egyedi.

Minden userhez tartozik az ASP Identity DB-ben egy account, melyhez a "User" role van rendelve.

Az elgondolás az, hogy amikor a user lehívja a saját egyedi linkjét, akkor azonosításra kerül és az alkalmazás automatikusan bejelentkezteti a usert egy közös, az alkalmazás konfigjában levő passwordal. A usernek sem usernevet sem passwordot nem kell ehhez ismernie, számára a folyamat nem látható.

A problémám az, hogy nem tudom hogyan irányítsam át automatikusan a még nem autentikált userek kéréseit a bejelentkezéseket kezelő kontrollerre úgy, hogy a userenként egyedi (fent vastagon szedett) szegmens is továbbküldésre kerüljön ami ugye szükséges a user azonosításához.

Én eddig csak ennyit láttam/találtam:
-(1) A ConfigureServices-ben lehet állítani a LoginPath-ot, de nem látom, hogy hogyan lehetne neki átadni paramétert. Anélkül pedig az auto-login nem fog menni. Erről van szó:

services.ConfigureApplicationCookie(options =>
{
....
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
....
});

-(2) A főoldal action-methodját publikusnak hagyom és minden alkalommal manuálisan ellenőrzöm a Httpcontext-ből, hogy található-e bejelentkezett user (ha nem, akkor átirányítás az account controllerre ,ott auto login, majd visszairányítás)

-Esetleg a (2)-es pontnál jobb ötlet?

-Kell-e nekem (a usereknek) ehhez egyáltalán autentikáció, vagy elég lenne a sessionben követni, hogy milyen egyedi linkkel (route segmenssel) jöttek be a userek és ez alapján végül is követhető lenne a dolog... :F

[ Szerkesztve ]

(#8622) sztanozs válasza joysefke (#8621) üzenetére


sztanozs
veterán

Az nem zavar, hogy az URL megszerzésével ellopható felhasználói fiók?

Szvsz authentikálni csak akkor érdemes, ha ténylegesen azonosítod is a felhasználókat (nem csak követni akarod őket valami módon). Amúgy meg tök mindegy, hogy egy végtelen élettartamú session azonosítóval vagy felhasználónévvel URL-ben azonosítod.

[ Szerkesztve ]

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#8623) joysefke válasza sztanozs (#8622) üzenetére


joysefke
veterán
LOGOUT blog

Nem.

Az admin account(ok) természetesen védve vannak, nem közös pwd-t használnak.

Az egyedi linkek mindössze arra szolgálnak, hogy az egyes userek vissza tudjanak jelezni, hogy részt vesznek-e egy eseményen vagy sem, illetve hányan jönnek. A linkek élettartama véget ér az esemény lezárulásával.

Lehetne erősebb az autentikáció, de akkor kb senki nem használná (szerintem). Így nem kell accountot regisztrálni meg pwd-t megjegyezni. Kapsz egy linket emailben, rákattintasz, visszajelzel egy formban aztán kész.

[ Szerkesztve ]

(#8624) joysefke válasza sztanozs (#8622) üzenetére


joysefke
veterán
LOGOUT blog

Hmmm

Megérte az időt hogy leírtam, így én is tisztábban látom a problémát. ;]

Mivel az adminoknak már eleve kell autentikáció, és az Account kontrollertől kapott login-formon jelentkeznek be stb, és mivel ez egészen más mint a userek auto-loginja, ezért sokkal jobban járok, ha a kettőt külön kezelem, az egyedi route-szegmens pedig validálás (létezik-e olyan user) után egyszerűen megy a Session-be...

[ Szerkesztve ]

(#8625) kutkut


kutkut
addikt

Sziasztok!

Egy SSD-re szeretném felrakni a VS 2017-et Xamarinnal, mindennel (emulátorral) együtt. Az SSD-t megosztanám C és D meghajtóra. A VS-t a D-re telepíteném, már amit a telepítő enged oda rakni.

A kérdés, hogy ebben a felállásban mennyi adatot foglalna mindenképp a C-n (ahol a Windows is van)?

A wint most telepítettem (frissen, üres SSD-re), és épp a particionálásnál tartok, csak nem tudom, így mekkorára hagyjam a C-t. Help pls! :D

Meizu MX3 32GB

(#8626) joysefke válasza kutkut (#8625) üzenetére


joysefke
veterán
LOGOUT blog

A kódjaidat tartalmazó mappák attól, hogy a C-n van a VS még lehetnek akár a D-n (nekem pont így van)

[ Szerkesztve ]

(#8627) kutkut válasza joysefke (#8626) üzenetére


kutkut
addikt

Nekem is így volt eddig, de én nem erre gondoltam. Hanem arra, hogy amikor magát A VS-t telepítenéd a D-re (márpedig én ezt szeretném), akkor csak egy részét tudja a D-re rakni, a többi a C-ből vesz el helyet. Eddig nem volt probléma, mert az egész csomag (amit használtam) volt kb. 3GB, de egy fullos Xamarin csomag ennek kb. a tízszerese.

A kérdésem az, hogy ebből mennyit akar a telepítő a C-re rakni. :R

Meizu MX3 32GB

(#8628) joysefke


joysefke
veterán
LOGOUT blog

kutkut: nem tudom

Szeretnék egy lépésben egy Http-requestet kiszolgálni és egy View-t visszaküldeni úgy, hogy a válaszban átírom a böngészőben megjelenő URL-t. Tehát nem a szerveren szeretném a Requestet egy másik címre a kliens elől rejtve átirányítani (url rewrite), illetve a klienset sem szeretném egy redirect-tel átküldeni egy másik címre, hanem egy lépésben szeretném a dolgot megtenni. Van erre lehetőség?

Amit konkrétan csinálni szeretnék:

http-get, URL : myawsomesite.cheapdomain.com/XYZ
XYZ alapján azonosítom a user-t, (ez a userName változóval bindol az URL szegmensből) a böngészéshez tartozó sessionbe beírom a user id-ját. Ez után azt szeretném, ha a user nem küldözgetné többet az XYZ azonosítót, azt le szeretném csípni az URL-ből.

Jelenleg ezt Redirect-tel oldom meg. (A ResponseModel egy egyszerű form amit megjelenítek a usernek)

public async Task<IActionResult> Index(string userName)
{
ResponseModel model = null;
if (!string.IsNullOrEmpty(userName))
{
AppUser user = await GetUserSetSessionIfFound(userName);
return RedirectToAction(nameof(Index));
}
else
{
AppUser user = await GetUserFromSession();
model = (user?.Response == null) ? null : new ResponseModel(user.Response);
return View(model);
}
}

[ Szerkesztve ]

(#8629) kutkut válasza kutkut (#8627) üzenetére


kutkut
addikt

Közben megválaszoltam magamnak: ~21 GB-ból kb. 13 GB-ot mindenképp a rendszerpartícióra telepítene. (Ennél kevesebb hely is elég lehet, csak most próbából elég sok Xamarinhoz kapcsolódó dolgot, SDK-t bepipáltam.) :R

Meizu MX3 32GB

(#8630) martonx válasza joysefke (#8624) üzenetére


martonx
veterán

Megint túlkomplikálod, és kevered a szezont a fazonnal. Akiket te usereknek hívsz, azok nem is igazi userek, hiszen a userek attól userek, hogy authentikálnak. Ezeket hívjuk inkább mondjuk participantoknak, akiket meg elég teljesen lazán, másképpen kezelni.
Belép az oldalra, bejelentkezik egy eseményre a megadott adataival, de ő ettől nem a szó szoros Asp.Net Identity értelmében user lesz, hanem csak egy participant. Ehhez csinálsz egy DB táblát, benne a generált participant hash-el, és attól kezdve elég csak azt használnod.

Én kérek elnézést!

(#8631) martonx válasza joysefke (#8628) üzenetére


martonx
veterán

Erre való a redirect, szóval ez így jó ahogy csináltad.

Én kérek elnézést!

(#8632) joysefke válasza martonx (#8630) üzenetére


joysefke
veterán
LOGOUT blog

igen-igen, azóta már tudatosult bennem, hogy ezeknek a "participantoknak" nincsen szüksége ugyanazokra az identity szolgáltatásokra mint az admin accountoknak.

csak mivel az admin részt implementáltam először, aztán mivel emiatt "benne voltam" az Identity-témában, így "adta magát", hogy az IdentityUser táblát használjam a participantok személyes adatainak kezelésére is (ezek külső importból jönnek). már tényleg inkább külön táblába raknám a participantokat. Most egy darabig ott maradnak...

[ Szerkesztve ]

(#8633) cigam


cigam
félisten
LOGOUT blog

Egy kis iránymutatás kellene. Van egy github-os program amit letöltöttem, és próbálom megtanítani magyarul. Viszont találtam benne egy hibát. Megjegyzi az utolsó könyvtárat, ahonnan betöltötte a fájlt. Viszont ha már nem elérhető hálózati útvonal(kikapcsolták a másik gépet), vagy meghajtó (pl. már kihúztam azt a pedrive-ot amin a szöveg volt), dob egy hátast:

Hogyan tudnám rábírni, hogy ekkor se essen kétségbe, hanem valamelyik alapértelmezett útvonalat pl. Dokumentumok mappával helyettesítse az elérhetetlen útvonalat?

Freeware, és akciós programok egy helyen https://www.facebook.com/freewarenews

(#8634) Keem1 válasza cigam (#8633) üzenetére


Keem1
addikt

Csak sematikusan, de kb. valahogy így csinálnám (ha jól értelmezem a kérdést):

if (!Directory.Exists(FilePath))
{
FilePath = Environment.SpecialFolder.MyDocuments;
}

[ Szerkesztve ]

(#8635) cigam válasza Keem1 (#8634) üzenetére


cigam
félisten
LOGOUT blog

Szerintem jól. Be is illesztettem a dialógusablak kódjába:
var dlg = new OpenFileDialog();
if (!string.IsNullOrWhiteSpace(documentPath))
{
dlg.FileName = Path.GetFileName(documentPath);
dlg.InitialDirectory = Path.GetDirectoryName(documentPath);
if (!Directory.Exists (dlg.InitialDirectory ))
{
dlg.InitialDirectory = Environment.SpecialFolder.MyDocuments;
}
dlg.Multiselect = false;
dlg.Title = "Dokumentum betöltése a súgóba...";
}

Viszont így nem fordul le: "Cannot impicitly convert type 'System.Enviroment.SpecialFolder' to 'string' 'Bookmark.PropertyChanged' hides inheritedmember. Gondolom valami típus eltérés van de nagyon nem értek hozzá.

Freeware, és akciós programok egy helyen https://www.facebook.com/freewarenews

(#8636) Keem1 válasza cigam (#8635) üzenetére


Keem1
addikt

Hmm.. Az a baj, hogy nincs a közelemben most Visual Studio.
Esetleg így? Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

Fejből sajna nem vágom most ezeknek a windows local variable mappáknak a típusát :D

(#8637) cigam válasza Keem1 (#8636) üzenetére


cigam
félisten
LOGOUT blog

Igen, pont most akartam írni, hogy sikerült kigugliznom a megoldát.

Köszi a segítséget!

Freeware, és akciós programok egy helyen https://www.facebook.com/freewarenews

(#8638) Keem1 válasza cigam (#8637) üzenetére


Keem1
addikt

Na, szuper, ennek örülök, sőt, még én is tanultam belőle. :D
Látszik, ha nem tudom rögtön fordítani a kódot, közel se biztos, hogy fejben jól áll össze :DDD

(#8639) cigam válasza Keem1 (#8638) üzenetére


cigam
félisten
LOGOUT blog

Gyorsan fel is töltöttem, remélem így kell!?

[ Szerkesztve ]

Freeware, és akciós programok egy helyen https://www.facebook.com/freewarenews

(#8640) joysefke


joysefke
veterán
LOGOUT blog

ASP .NET Core 2.1 MVC - konfig file update

Kerestem, de nem találtam gyári megoldást...

Az appsettings.json file-t használom a statikus konfiguráció tárolására. A kontrollerből DI-jal elérem a konfigurációt és tudom olvasni, ez pedig nagyon szép és jó.

Ezen felül azt szeretném, hogy egy másik .json konfig-fájlban tárolt, az admin által az alkalmazáson belül konfigurálható beállításokat tudnám tárolni-updatelni.

Tehát updatelni szeretném a json konfig fájlban található beállításokat.

Valahogy így képzelem el (tutorialból összevágva)

Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("starship.json", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>();

Kontrollerben kiolvasom a config-sectiont, feltöltök vele egy modell osztályt, ami a UI-n keresztül updatelve lesz. Ezt a változást szeretném kommittálni a konfig-fájlba.

var starship = new Starship();
configuration.GetSection("starship").Bind(starship);
....
starship.Name = "Bismarck";

Van erre valami gyári megoldás, ami nem igényli azt, hogy nekem kelljen írásra megnyitni és updatelni a konfig fájlt? Végül is ez is egy opció lehetne, mert a felhasználás kizárja, hogy egyszerre több helyről próbálják írni a konfigurációt...

[ Szerkesztve ]

(#8641) martonx válasza joysefke (#8640) üzenetére


martonx
veterán

Amit kitaláltál, az így nem fog menni. Mivel az appsettings file, vagy bármilyen custom settings file, amit beillesztesz az Asp.Net Core-os settings rendszerbe, egyszer olvasódik be, a rendszer indulásakor. Azaz ez nem arra való, hogy egy admin menet közben állítgassa, ez egy statikus settings file nagyon ritkán változó értékeknek.
Amit te szeretnél, az egy bármilyen adat tárolás (DB tábla, vagy egy file), és abba szabadon írkálhat az admin, ezt mondjuk egy repository-n, vagy service-en keresztül ugyanúgy tudod DI-al használni, fölé tehetsz egy enumot, de igazán típusos sosem lesz. Ezt key-value párként fogd fel.
Az aktuális értékeket meg bedobod egy memory cache-be, amit ürítesz, amikor az admin hozzányúlt az admin felületén, és kész is vagy.

Én kérek elnézést!

(#8642) joysefke válasza martonx (#8641) üzenetére


joysefke
veterán
LOGOUT blog

Igen, én is arra jutottam, hogy nem működik és a legjobban akkor járok, ha SettingsModel <=Json=> settings.json alapon mentem le fájlba.

Ehhez képest a doksi azt mondja, hogy:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.1

File Configuration Providers have the ability to reload configuration when an underlying settings file is changed after app startup. The File Configuration Provider is described later in this topic.

És ha megnézed, beállítottam a reloadOnChange flag-et.

Mivel a Configuration nem tartalmaz olyan opciót, hogy mentse a file-ba a változásokat, ezért próbaképpen
felülírtam a konfig file-t:
File.WriteAllText("MySettings.json", jsonString)

Nem olvasta újra a konfigurációt a felülírt fájlból...
Más doksik is azt mondják, hogy a reloadOnChange "elméletileg" működik

[ Szerkesztve ]

(#8643) harylmu válasza martonx (#8641) üzenetére


harylmu
őstag

Kivéve, hogy jól írta, a reloadOnChange valóban ezt jelenti. [link]
Persze más kérdés, hogy ilyen célra valóban nem configot használunk, hanem valami adattároló repositoryt (db vagy sima csv store).

[ Szerkesztve ]

(#8644) joysefke válasza harylmu (#8643) üzenetére


joysefke
veterán
LOGOUT blog

Persze más kérdés, hogy ilyen célra valóban nem configot használunk, hanem valami adattároló repositoryt

Nem az appsettings-be hanem külön json-konfig fájlokba akartam rakni a változó (értsd tipikusan egyszer konfigurált) konfigurációs adatokat. Még ha valami hiba is kerülne bele, akkor sem történne semmi és nem rántaná magával az appot.

Az én esetemben az admin felületről beküldött a program által validált adat került volna bele ebbe a json-ba. Tehát attól nem kell félni, hogy valami hibás adat bekerül a konfigba, az app reloadolja és valami parsing exceptionnal elszáll valahol.

Konkrétan egy másik szerver-hez a kapcsolódási beállításokról van szó.

[ Szerkesztve ]

(#8645) joysefke


joysefke
veterán
LOGOUT blog

Ehh, működik a reloadOnChange, és a dolog nyitja tényleg az volt, ami stackoverflow linken van.

Így már működik ez az egész felülírom a konfig-fájlt (egyetlen kis konfig fájlt, ami nem kritikus) és az abban tárolt konfiguráció újratöltődik dolog. nyilván nem adatbázisként érdemes használni.

Leírom hátha jó lesz valakinek. Én azóta már máshogy csináltam, de a példakód működik :)

config.json :
{
"config": {
"Name": "Bismarck",
"Registry": "NCC-1701",
"Class": "Constitution",
"Length": 500.0,
"Commissioned": true
}
}

tartozik hozzá egy POCO modell class amibe beolvastatom a config.json-t.
public class Config
{
public string Name { get; set; }
public string Registry { get; set; }
public string Class { get; set; }
public decimal Length { get; set; }
public bool Commissioned { get; set; }
}

Program.cs
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("config.json", optional: true, reloadOnChange: true);
})

Ez a kritikus részlet:
Startup.cs
services.Configure<Config>(Configuration.GetSection("config"));

Innentől kezdve működik nálam a reloadOnChange akár felülírom, akár csak egy value-t írok át benne kézzel.

Ha felül akarom írni, csinálok egy anonim típust amelynek az egyetlen property-je a megváltozott Config objektum. Ezzel a trükkel beírja az osztály nevét is a config.json-ba. (amire szükség van, mert key-ként használjuk)

var root = new
{
config = changedConfigObject
};

string newConfig = Newtonsoft.Json.JsonConvert.SerializeObject(root);
System.IO.File.WriteAllText("config.json", newConfig);

[ Szerkesztve ]

(#8646) tomazin


tomazin
veterán

Borzasztó egyszerű dolgot szeretnék, de valami nem klappol.
Adott egy web service, behúzom VS2017 alá, rendben látja is a függvényeket, szignatúráit, stb.
Létrehozok egy példányt, majd meghívom, hogy adja meg milyen valuták vannak:

MNBArfolyam.MNBArfolyamServiceSoapClient client = new MNBArfolyam.MNBArfolyamServiceSoapClient("CustomBinding_MNBArfolyamServiceSoap");
MNBArfolyam.GetCurrenciesRequestBody CurrReqBody = new MNBArfolyam.GetCurrenciesRequestBody();
MNBArfolyam.GetCurrenciesResponseBody CurrRespBody = client.GetCurrencies(CurrReqBody);

Erre a getcurrencies hívásnál System.ServiceModel.EndpointNotFoundException-el száll el, és még - gondolom én - szépen be is olvassa az mnbtől, hogy nem volt sikeres a móka:

"A(z) http://www.mnb.hu/arfolyamok.asmx nem rendelkezett figyelő végponttal, amely tudta volna fogadni az üzenetet. Ezt gyakran téves cím vagy SOAP-művelet okozza. További információ a belső kivétel leírásában olvasható."

Akárhány tutorialt nézek meg, miután példányosítja a klienst, onnantól használja.
mit nézek ennyire be?

[ Szerkesztve ]

(#8647) Zalanius válasza tomazin (#8646) üzenetére


Zalanius
tag

Miért adtál argumentumot a clientnek? Nélküle rendben működik. (Rövidítettem a deklarációkon, hogy ne legyen scrollbar.)

var client = new MNBArfolyamServiceSoapClient();
var body = new GetCurrenciesRequestBody();
var resp = client.GetCurrencies(body);
Console.WriteLine(resp.GetCurrenciesResult);

--= Zalán =--

(#8648) Peter Kiss válasza tomazin (#8646) üzenetére


Peter Kiss
senior tag
LOGOUT blog

Rossz helyen van a konfigod. Ha egy külön assemblybe pakoltad a generált klienst, és nem közvetlenül a futtató bármibe, akkor a generált konfigot az app.config-ból emeld át a másik app.config-ba vagy web.configba.

(#8649) tomazin válasza Peter Kiss (#8648) üzenetére


tomazin
veterán

Nem igazán értem amit írsz..Egy excel addin projectet hoztam létre, az alá behúztam (add->sercive reference) a webservicet, csináltam egy "ribbont", felraktam egy gombot, rákötöttem, a thisaddin-ban lévő függvényt. Egyetlen app.configom van.

Kliens "kigenerálást" én direktben nem csináltam, megértésem szerint azt a VS alapból elvégzi.

Zalanius kínomban, ha átmásolom amit írsz, azzal is ugyanoda jutok

megoldás:
tűzfal nem engedte ki az excelt a netre...

[ Szerkesztve ]

(#8650) t-shirt


t-shirt
veterán

Sziasztok!

Egy kis segítséget szeretnék kérni. Nem vagyok túl jártas a C# nyelvben, de össze kellene raknom egy kis programot. Amivel gondom akadt, hogy a programnak soros porton keresztül kell adatot fogadnia és küldenie.

Össze ollóztam a netről egy kis programot, amivel a kommunikációt akartam lepróbálni, de sajnos csak részben működik. A program fogadni képes a portra érkező adatot, de ha küldök rá akkor ledob hibával, a „sendSerialPort.Open();” sort jelöli ki és valami olyasmi volt a hibaüzenet hogy nincs jogosultságom (nem vagyok otthon így nem tudom pontosan).

Ha valakinek van ötlete, hogy mi lehet a hiba a programban vagy tud egy jó leírást soros port kommunikációjához esetleg akad egy működő példa program soros portra azt nagyon megköszönném.

using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
SerialPort port = new SerialPort("COM4");
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;

port.DataReceived += Port_DataReceived;
port.Open();

Console.WriteLine("Küldj üzenetet a COM4 portra:");
while (!(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)) {
WriteData(Console.ReadLine());
}
port.Close();
sendSerialPort.Close();
}

static SerialPort sendSerialPort = new SerialPort("COM4");

private static void WriteData(string readLine)
{
if(sendSerialPort.IsOpen == false)
{
sendSerialPort.BaudRate = 9600;
sendSerialPort.Parity = Parity.None;
sendSerialPort.StopBits = StopBits.One;
sendSerialPort.DataBits = 8;
sendSerialPort.Handshake = Handshake.None;
sendSerialPort.RtsEnable = true;

sendSerialPort.Open();
}

sendSerialPort.WriteLine(readLine);
}

private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var sp = (SerialPort)sender;
string dataReceived = sp.ReadExisting();
Console.WriteLine("A vissza jövö uzenet a COM4 port ra: " + dataReceived);
}
}
}

[ Szerkesztve ]

Copyright © 2000-2024 PROHARDVER Informatikai Kft.