- iPhone topik
- Xiaomi 14T Pro - teljes a család?
- Motorola Edge 40 - jó bőr
- Egy szenzor, két zoomkamera: újraírta a Huawei a mobilfotózás történetét
- Google Pixel 9 Pro XL - hét szűk esztendő
- Google Pixel topik
- Megérkezett a Google Pixel 7 és 7 Pro
- Honor Magic7 Pro - kifinomult, költséges képalkotás
- Poco M3 - felújított állomás
- Térerő gondok, tapasztalatok
Új hozzászólás Aktív témák
-
Zalanius
tag
válasz
t-shirt #8699 üzenetére
A ciklusban, a létrehozott példányoknál célszerű elvégezni még az eseménykezelő hozzárendelését, valahogy így:
rdo.CheckedChanged += new System.EventHandler(this.Altalad_Felirt_Metodus);
Aztán az eseménykezelőben a sender objectről feltételezzük, hogy RadioButton:
RadioButton rb = (RadioButton)sender;
// stb.De lehet külön típusvizsgálatot is tartani egy is segítségével, ha éppen szükséges.
-
t-shirt
veterán
Köszönöm. Azt tudom hogy ezek kellenek, illetve ezeket találtam általában a leírásokban is, de sehogy nem akar összejönni. Lepróbálgattam az "iskola példákat" azok persze mennek, de azokban konkrét kirakott radiobutton-ok vannak amikre lehet CheckedChanged -et dobni, a sender-t meg nem is igazán értem igazán, azt is csak egy konkrét rb-vel tudtam meghívni és amit kiírt azzal se mentem sokra.
Nyilván én csinálok valamit rosszul, de tényleg nem jövök rá hogy mit.
-
t-shirt
veterán
Tiszteletem!
Lenne egy valószínűleg amatőr kérdésem.
Ha generálok egy listát ami változó tartalmú/elemszámú lehet és a listából RadioBotton-okat hozok létre akkor hogyan tudom egy eseménykezeléssel lekérdezni hogy melyik lett kiválasztva?
foreach (string elem in lista)
{
RadioButton rdo = new RadioButton();
rdo.Text = elem;
rdo.Location = new Point(5, rdo_y);
bool CheckedChanged = false;
this.Controls.Add(rdo);
rdo_y += 20;
} -
Keem1
veterán
Bocsánat, nem tudtam, hogy kezdő vagy.
Szóval, a random szám generátorral csak egy random tömbindexet készítesz, nem a tömb egy random indexét veszed ki.Tehát a séma:
- X legyen egy véletlen szám, ami legalább 0, legfeljebb a tömböd mérete.
- a keresett elem az X indexű elem a tömbbentomb[X]
. -
mdk01
addikt
Sziasztok, hogyan lehet egy tömb elemei közül véletlenszerűen kiválasztni egyet? A neten csak olyan példákat találok ahol a tömböket véletleszerű számokkal töltii fel de ez nem ugyanaz.
Int veletlen=rnd.Next(tm[i ]);
megoldásnál aláhúzza pirossal az i-t.
Köszönöm -
joysefke
veterán
válasz
martonx #8687 üzenetére
A Petyus_ féle Usermanager.ChangePasswordAsync(...) tökéletesen működik, azt csinálja ami nekem kell. Nem értem, hogy kerülhette el a figyelmemet pont ez a metódus, amikor vS-ban böngésztem a UserManager interfészét...
8683 Petyus_
De a ChangePassword, amit írtam korábban, az belépett felhasználóra vonatkozik, oda csak egy oldPassword, newPassword kellKipróbáltam, nem szükséges feltétel, hogy belépve legyen a felhasználó akinek megváltoztatod a jelszavát.
-
martonx
veterán
válasz
joysefke #8685 üzenetére
Így fejből nem tudom. Csinálnék egy új projektet bekapcsolt security-vel, és árgus szemekkel figyelném a kapott kész kódot (ez alapból valami nuget package mögé lesz rejtve, és ki kell scaffoldolni, hogy tényleg látszódjon). Ami kész van és működik, arra minek custom megoldás?
-
joysefke
veterán
válasz
martonx #8684 üzenetére
Mi a gyári default megoldás, mert én azt hittem, hogy az a default amit én csináltam...?
Egyébként nem a fórumra írogatással szoktam kezdeni8683:
Én is erre gondoltam. Startup-ban nincsen konfigurálva DI az IPasswordValidator-hoz, mégis visszaad egy valamilyen default validátor objektumot. Valószínűnek tartom, hogy ez a default validátor nem tartalmazza automatikusan a Startup.AddIdentity()-ben bekonfigurált pwd-requirementeket. Arra, hogy hogyan kéne csinálni viszont nem találtam példát (csak custom pwd-validátorra, azt viszont nem feltétlenül akarok) -
petyus_
senior tag
válasz
joysefke #8682 üzenetére
1. most hirtelen nem tudom a választ, valószínűleg a DI-al lesz a gond, nem azt a passwordValidatort kapod, amit a userManager használ.
2. az a reset password, ott nincs belépve a user, hanem pl elfejtette a jelszavát, kiküldöd neki a passwordResetToken-t, rányom a linkre, és úgy kapod meg.
De a ChangePassword, amit írtam korábban, az belépett felhasználóra vonatkozik, oda csak egy oldPassword, newPassword kell.
-
joysefke
veterán
válasz
petyus_ #8681 üzenetére
Nincs most vS a közelben, van bennem egy sör
1, egyetlen tranzakciót szeretnék, ha sikerül, akkor minden sikerüljön, ha nem sikerül, akkor semmi változás ne legyen. Attól függetlenül, hogy minden előre falidálva van
2, amit találtam fgv az valami email tokent kért paraméterként.
-
joysefke
veterán
.NET Core 2.1, ASP.NET Core 2.1 IPasswordValidator
Amikor kreálok egy usert, akkor a beállított password policy szépen alapján a kért jelszó erőssége szépen validálásra kerül,
azonban amikor meg akarom változtatni a beállított jelszót és a kért új jelszó erősségének validálásához a beépített default
IPasswordValidator
ból (amit bár nem konfiguráltam DI-re, mégis valahogy működik a[FromServices]
) kérek egy példányt és azzal próbálok validálni, akkor a validálás nem működik, bármilyen jelszó elfogadásra kerül.Startup.cs
services.AddIdentity<AppUser, IdentityRole>(
opts => {
opts.User.RequireUniqueEmail = true;
opts.Password.RequiredLength = 3;
opts.Password.RequireNonAlphanumeric = false;
opts.Password.RequireLowercase = false;
opts.Password.RequireUppercase = false;
opts.Password.RequireDigit = false;
})Kontroller
Usert így kreálom:AppUser newUser = new AppUser { UserName = model.Name, Email = model.Email };
IdentityResult result = await userManager.CreateAsync(newUser, model.Password);
if (result.Succeeded)
{
// safe to assume that the below operation will succeede
await userManager.AddToRoleAsync(newUser, "Admins");
return RedirectToAction(nameof(AdminUsers));
}És így szeretném megváltoztatni a passwordot:
Fügvény deklaráció, DI. Érdekes, hogy a Startup-ban én semmit nem rendeltem az IPasswordValidator-hoz
public async Task<IActionResult> Edit2(
[FromServices]IPasswordValidator<AppUser> passwordValidator,
[FromServices]IPasswordHasher<AppUser> passwordHasher,
EditModel model, string newPwd).....
Itt szeretném a jelszó erősségét validálni és ha megfelel megjelölöm, hogy updatelni akarom
IdentityResult passwordResult = await passwordValidator.ValidateAsync(userManager, userToEdit, model.Password);
if (!passwordResult.Succeeded)
foreach (var error in passwordResult.Errors)
ModelState.AddModelError("", error.Description);
else
passwordNeedsChange = true;Itt hajtom végre az IdentityUser updétjét:
if (ModelState.IsValid)
{
if (emailNeedsChange)
userToEdit.Email = model.Email;
if (passwordNeedsChange)
userToEdit.PasswordHash = passwordHasher.HashPassword(userToEdit, model.NewPassword);
var updateResult = await userManager.UpdateAsync(userToEdit);
....
}Előre is köszi!
#8679 Köszi!
-
martonx
veterán
válasz
joysefke #8677 üzenetére
"Ami nekem nem tiszta az, hogy ha az Azuron elérhető lesz egy újabb verziójú futtatókörnyezet, de az én projektem verzió lemaradásba került, akkor meddig tudom azt deployolni Azurra"
Évekig. A .Net Core 1.1-et mondjuk hamarosan kivezetik, de ha jól rémlik 2 éve jött ki az 1.1.
Ilyen étren semmi különbség nincs a free tier és a shared között. Sőt még ha erősen fizetsz érte se fognak a bevett gyakorlatukon csak miattad változtatni.Hm, bár pont tudok ellenpéldát is mondani, nekünk az Amazaon AWS volt, hogy adott plusz egy év türelmi időt, igaz mi havi 20-30.000 dollárt hagyunk náluk, nem havi 10-et
-
joysefke
veterán
válasz
martonx #8675 üzenetére
azzal illik tisztában lenni, hogy a futtató környezetek mindig kis lemaradásban vannak
Persze, a dolognak ez a része egyértelmű, és az ember nem is ugrik rá addig a legújabbra, amíg azzal nincsen tapasztalat. Jobb más kárán tanulni.
Ami nekem nem tiszta az, hogy ha az Azuron elérhető lesz egy újabb verziójú futtatókörnyezet, de az én projektem verzió lemaradásba került, akkor meddig tudom azt deployolni Azurra, illetve ha már van az Azuron egy nem utolsó stabil verziós futtatókörnyezetre támaszkodó appom, annak a függősége meddig lesz támogatva? Mikor húzzák ki a futó app alól a szőnyeget?
Különösen, ha "free tier" App Servicen vagyok, ahol nyilván shared VM-ek futtatják az appokat és gondolom nem fognak az én hobbi projektem miatt határozatlan ideig fenntartani egy kifutó futtatókörnyezetet.
Szóval, ha előbb utóbb szeretném békénhagyni a projektet és hagyni, hogy csak fusson magában, akkor nem jobb-e mégis csak "self hosted"-ként deployolni, még akkor is, ha egyébként tudnám közvetlenül futtatni?
üdv
J. -
martonx
veterán
válasz
joysefke #8673 üzenetére
Önmagában az update az nudli. viszont ha már Azure-ozol, azzal illik tisztában lenni, hogy a futtató környezetek mindig kis lemaradásban vannak, azaz ez nem úgy megy, hogy kijön egyik nap az Asp.Net 2.2 és akkor másnap már az Azure is tudja, és Azure szerte mindenhova fel van telepítve. Ennek 1-2 hét, de akár hónap is kellhet (AWS és egyéb felhő szolgáltatóknál még rosszabb a helyzet).
-
joysefke
veterán
Sziasztok!
Van egy .NET Core 2.1 + ASP.NET CORE 2.1 Web app-om.
Nem túl nagy, én csináltam, és hozzá tudok/merek nyúlni. A célom az lenne, hogy1, egyrészt a legutolsó stable .NET Core + ASP.NET Core verzión tartsam, lehetőség szerint
2, lehetőség szerint mindig közvetlenül (ha lehet self contained opció nélkül) tudjam Azure App Service-ben futtatni.
Egy hónap után újra deployoltam az appot Azure-ra. Különböző okok miatt ezzel megint órákat sz**tam mire végül elindult Azuron. Az Azure hibaüzenetek számomra elég semmitmondóak. stb stb. A vége az lett, hogy most csak a self contained opcióval tudtam futásra bírni. Egy hónapja órák hosszat szívtam az Azure-val (ekkor láttam az Azure-t először) mire rájöttem, hogy ha a release targetet x86-ra állítom, akkor hajlandó lesz elindulni az app, itt még nem kellett neki a self contained opció
Azt lehet előre tudni, hogy a 2.1 -> 3.0 (stable) az egy közvetlen lépés lesz-e, vagy útba kell-e ejteni a .NET Core 2.2, ASP NET Core 2.2-t? Vagy bele kell nyúlni a kódba stb?
Elolvastam a 2.1->2.2 update instrukciókat és van benne rendesen manuális konfig fájl írás. Attól félek, hogy ha nekiállok a csomag verziókat kézzel editálgatni, akkor egy következő váltásnál megint szenvedéssel fogom Azuron működésre bírni.
Nyilván csinálhatok egy üres 2.2-es projektet és manuálisan átmásolhatok bele mindent, de az megint plusz munka.
.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<UserSecretsId>9b4b6fbc-c156-49cb-9d78-15de78924438</UserSecretsId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Folder Include="Migrations\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CsvHelper" Version="9.2.3" />
<PackageReference Include="FluentValidation" Version="8.1.1" />
<PackageReference Include="MailKit" Version="2.1.2" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.8">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.1" />
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions>
</Project>Szerk:
Az sem tiszta, hogy a VS Installer miért nem ajánlja fel a 2.2-es SDK telepítését, miért kell azt VS-en kívülről telepíteni -
t-shirt
veterán
Szia!
Egy olyan kérdésem lenne, hogy a program által kiküldött string végére mindig tesz egy "\r\n" -t (új sor, előre ugrás). Valahogy megoldható, hogy ezeket ne küldje csak a string-et?
A program igazából jól működik csak valami gondja van a vezérlőnek és próbáljuk kizárni a lehetséges hibákat hátha ez segítene.
-
sztanozs
veterán
válasz
zsolti_20 #8668 üzenetére
Írtam egy alkalmazást Visual Studioban C# nyelven. Lehetséges a megírt programot eladni? Igen
Vagy van valami jogi következménye ennek? Igen, főleg, ha nem adsz számlát és/vagy nem adózol rendesen utána.
Esetleg a teljes program megvásárlása esetén tudnám csak értékesíteni ezt? Nem, a Community Edition használatával jogot is kapsz a haszonszerzéshez - amennyiben magánszemélyként vagy egyéni vállalkozóként fejlesztesz és nem egy nagy cég szerződéses fejleszőjeként dolgozol . -
zsolti_20
senior tag
Üdv emberek! Írtam egy alkalmazást Visual Studioban C# nyelven. Lehetséges a megírt programot eladni? Vagy van valami jogi következménye ennek? Esetleg a teljes program megvásárlása esetén tudnám csak értékesíteni ezt?
-
joysefke
veterán
Ahogy fent írtam, nem ismerem a SerialPortot, de ez a SerialPort.ReadLine() -a nevéből ítélve
- blokkol nem? Innentől kezdve a thread amihez hozzá van kötve IO-limitált.
kódodnál nem azért nem fogja feleslegesen terhelni a CPU-t, mert áttetted a futását egy másik szálra
igen ezzel tisztában vagyok -
dqdb
nagyúr
válasz
t-shirt #8662 üzenetére
Ez esetben elég ennyi módosítás, és nem fogja a CPU-t tekerni feleslegesen:
using (var port = new SerialPort("COM" + cp))
{
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();
while (fo_tomb_index <= (fo_tomb_merete-1))
{
receivedNewRequest.WaitOne();
var s = port.ReadExisting();
WriteData(port, fo_tomb[fo_tomb_index]);
Console.WriteLine(fo_tomb[fo_tomb_index]);
fo_tomb_index++;
}
}
}
private static WaitHandle receivedNewRequest = new AutoResetEvent(false);
private static void WriteData(SerialPort port, string readLine)
{
port.WriteLine(readLine);
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
receivedNewRequest.Set();
}joysefke: a kódodnál nem azért nem fogja feleslegesen terhelni a CPU-t, mert áttetted a futását egy másik szálra, hanem azért nem, mert a példádban a SerialPort.ReadLine hívást használod, ami ReadTimeout időt vár, mielőtt visszatérne, ha nincsen adat, és közben értelmes módon várakozik.
-
t-shirt
veterán
Köszönöm a válaszokat!
Lehet nem volt egyértelmű, így leírom pontosabban a működést.
A munkagép egy fűrészgép léptető motorral mikrovezérlővel stb, ez kapcsolódik a PC-hez.
A program elindítása után feldolgozza az adatokat egy file-ból és elkészít egy tömböt mely a vágandó deszkák méretét tartalmazza vágási sorrendben. Nem szükséges fejléc vagy egyéb azonosítás.Elsőnek a fűrészgép üzen hogy kéri az adatot -> a PC elküldi az első deszka hosszát, ez ismétlődik a tömb végéig. Az üzenet általában 4 karakter. A deszka hosszon kívül küldi még ha új darabot kell betenni vagy ha minden ki lett vágva, ezek is a tömbbe vannak berendezve a megfelelő helyre, de ezek most nem relevánsak illetve megoldottak.
Megnéztem és az üres pörgés valóban felviszi a proci terhelését, szóval ezt tényleg át kell alakítanom.
A timeout-on már én is gondolkoztam, hogy azt valahogy le kell kezelni ha egy idő után nem válaszol a munkagép. Egyenlőre nem rendelkezem azzal információval hogy mennyi ideg tart egy vágás.
Amiket írtatok igyekszem értelmezni, azt hiszem lesz még kérdésem
-
joysefke
veterán
válasz
t-shirt #8656 üzenetére
Igen, az idő nagyobbik részében üresen pörög, okozhat ez gondot?
Az oprendszer nem tudja eldönteni, hogy egy programszál azért pörög maxon mert nem csinál semmit azon kívül, hogy egy üres ciklusban van, vagy azért mert tényleges dolga van. Pár ilyennel le lehet terhelni a gépet.Konzolos program esetében megoldható hogy várakozzon az eseményre anélkül hogy lefutna (kilépne)? Lásd pld. fent. ott a main thread bevárja a másikat mielőtt kilépne. Ha a main thread előbb végezne, akkor annak a kilépése a többi threadet is befejezné (konzol applikációban).
-
joysefke
veterán
válasz
t-shirt #8654 üzenetére
Én úgy értettem a dolgot, hogy a gép kezdi az üzenetváltást, és a PC szemszögéből mindig
fogadás-írás-fogadás-írás stb a sorrend. Itt a PC a szerver és ha ezt a feladatot kiszervezed egy külön threadbe akkor nyugodtan lehet blokkolni azt a threadet a munkagépre történő várakozással. Persze ahogy fölöttem írták, nem ártana ide sem egy timeout...Ha blokkoló olvasással oldod meg a dolgot, akkor valahogy így nézhet ki a dolog.
(sosem volt serial portal dolgom és ezt amit válaszoltam sem tudom futtatni)Indítasz egy threadet amely minden munkacikus elején ellenőrzi, hogy szabad-e tovább futnia, ha nem, akkor rendezetten kilép. Olvas-ír-olvas-ír amíg el nem fogynak a fo_tomb-ből a parancsok.
A main() -thread nincsen blokkolva egészen a
serverThread.Join()
-ig Ennél a pontnál bevárja a serverThread-et. ha a main()-en belül a serverThread befejezte előtt beállítod aserverAllowedToRun=false
-ot, akkor az leállítja a soros-port threadjét.class Program
{
// dummy data
private static string[] fo_tomb = Enumerable.Range(0, 100).Select(x => "Machine command nr: " + x.ToString()).ToArray();
private static bool serverAllowedToRun = true;
public static void ComServer()
{
using (var port = new SerialPort("COM4"))
{
// ezek menjenek fgv-paraméterbe
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.Open();
int n = fo_tomb.Length;
int i = 0;
while (serverAllowedToRun)
{
if (i >= n) break;
// ez a te 'mentes_valtozo' -d
// a PC olvasással kezd
// ez blokkol ameddig gép nem küld valamit amit a PC tud olvasni.
// nem pörgeti a gépet
string machineMessage = port.ReadLine();
// Ha a gép küldött üzenetet, akkor válaszolunk rá
port.WriteLine(fo_tomb[i]);
i++;
}
}
}
static void Main()
{
Thread serverThread = new Thread(ComServer);
// Érdemes lehet timeoutot megadni
// pld 10 perc: TimeSpan.FromMinutes(10);
serverThread.Join();
}
} -
dqdb
nagyúr
válasz
t-shirt #8656 üzenetére
Ha a kommunikációban a PC a kliens és az eszköz a szerver, ami a kérésekre válaszol, akkor érdemes egy megfelelő timeout értéket választani és beállítani, amin belül a túloldalnak biztosan válaszolni kell, a DataReceived esemény kezelésére nincsen szükség, és a Read metódussal kiolvasni a választ, ez vár a timeoutnak megfelelő időt, ha nem kap választ. A válasz olvasásának módján a protokolltól függően lehet finomítani (fejléc van-e, kiderül-e előre, mekkora lesz az üzenet és hasonlók).
Ha a kommunikációban a PC a szerver és az eszköz a kliens, aminek a kéréseire válaszol a PC, akkor célszerű lenne a DataReceived eseményben egy AutoResetEvent példányt élesíteni Set metódussal, a fő ciklusban pedig WaitOne hívással várakozni rá, és ott kiolvasni a kapott adatot. Így nem pörögne 100%-on egy mag feleslegesen várakozás közben.
-
-
joysefke
veterán
válasz
t-shirt #8654 üzenetére
Amikor a
mentes_valtozo == null
akkor a main thread üresben pörög, teljes sebességgel. És nyilván ez a "normál" állapot, mert mind a soros port, mind a munkagép sebessége elmarad a processzorétól.Másrészt a mentes_valtozo statikus. Ha két thread is hozzáfér, akkor a hozzáféréseket szinkronizálni kell.
-
t-shirt
veterán
Sikerült megírni amit szerettem volna, de nem lett túl elegáns, ami valószínűleg csak az én járatlanságomnak köszönhető.
A port kommunikáció elvár működése: a „munkagép” küld egy üzenetet a soros porton keresztül a PC-nek miszerint várja a következő adatot. A program ezt az eseményt érzékelve egy tömbből elküldi a következő adatot és várja az újabb adatkérést.A gondom azzal volt, hogy a példa programban amit sikerült életre kelteni a küldés és fogadás külön metódus, és nem sikerült egybe gyúrnom a kettőt. Szerintem az egyik ideális megoldás az lenne, hogy a fogadás metódusnál megtörténik az esemény kezelés és az meghívná a küldés metódust. Ezt viszont nem tudtam megírni mert ahhoz, hogy meghívjam a küldésnek át kell adnom a többek között a ’port’-ot is, de azt meg nem tudtam bevinni a ’Port_DataReceived’-hez.
A jelenlegi működés az hogy ha jön üzenet akkor egy változóba írok ’mentes_valtozo’ ezt a változót egy ciklusban (main, using) kiértékelve meghívom a küldés metódust és nullázom a ’mentes_valtozo’-t.
using (var port = new SerialPort("COM" + cp))
{
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();
while (fo_tomb_index <= (fo_tomb_merete-1))
{
if (mentes_valtozo != null)
{
WriteData(port, fo_tomb[fo_tomb_index]);
mentes_valtozo = null;
Console.WriteLine(fo_tomb[fo_tomb_index]);
fo_tomb_index++;
}
}
}
}
private static string mentes_valtozo;
private static void WriteData(SerialPort port, string readLine)
{
port.WriteLine(readLine);
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var sp = (SerialPort)sender;
string dataReceived = sp.ReadExisting();
mentes_valtozo = dataReceived;
} -
dqdb
nagyúr
válasz
t-shirt #8650 üzenetére
A soros port egy olyan állatfajta, amit egyszerre csak egy példányban lehet megnyitni, ráadásul full duplex átvitelre képes, így azon az egy példányon keresztül mehet a küldés-fogadás.
Emellett érdemes rászokni a
using
használatára olyan esetben, amikorIDisposable
interfészt megvalósító osztállyal dolgozol, mint aSerialPort
, hogy exception esetében is garantáltan meghívódjon aDispose
metódus.Vakon belemódosítva valami ilyesmi lenne:
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
using (var 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(port, Console.ReadLine());
}
}
private static void WriteData(SerialPort port, string readLine)
{
port.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);
}
}
} -
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);
}
}
} -
tomazin
veterán
válasz
Peter Kiss #8648 üzenetére
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... -
Zalanius
tag
válasz
tomazin #8646 üzenetére
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); -
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? -
joysefke
veterán
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); -
joysefke
veterán
válasz
Froclee #8643 üzenetére
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ó.
-
joysefke
veterán
válasz
martonx #8641 üzenetére
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.1File 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 -
martonx
veterán
válasz
joysefke #8640 üzenetére
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. -
joysefke
veterán
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...
-
Igen, pont most akartam írni, hogy sikerült kigugliznom a megoldát.
Köszi a segítséget!
-
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á.
-
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?
-
joysefke
veterán
válasz
martonx #8630 üzenetére
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...
-
martonx
veterán
válasz
joysefke #8624 üzenetére
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. -
joysefke
veterán
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);
}
} -
kutkut
addikt
válasz
joysefke #8626 üzenetére
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.
-
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!
-
joysefke
veterán
válasz
sztanozs #8622 üzenetére
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...
-
joysefke
veterán
válasz
sztanozs #8622 üzenetére
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.
-
sztanozs
veterán
válasz
joysefke #8621 üzenetére
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.
-
joysefke
veterán
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...
-
martonx
veterán
válasz
joysefke #8619 üzenetére
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. -
joysefke
veterán
válasz
martonx #8618 üzenetére
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...
-
martonx
veterán
válasz
joysefke #8617 üzenetére
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.
-
joysefke
veterán
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ödikAz 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'. -
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.
-
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; -
I02S3F
addikt
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?
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).
-
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. -
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.'
-
amdni
aktív tag
válasz
petyus_ #8606 üzenetére
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;
}}
-
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).
-
amdni
aktív tag
válasz
petyus_ #8604 üzenetére
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;
} -
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! -
kingabo
őstag
Svéd kódban volt rengeteg "apa" nevű változó és "igen" komment.
(apa == majom, igen == újra / még 1*) -
martonx
veterán
válasz
lord.lakli #8595 üzenetére
Pedig de. Kivételek nyilván lehetnek, de azok csak erősítik a szabályt.
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Motorolaj, hajtóműolaj, hűtőfolyadék, adalékok és szűrők topikja
- iPhone topik
- Parkside szerszám kibeszélő
- Kerékpárosok, bringások ide!
- Xiaomi 14T Pro - teljes a család?
- Macska topik
- 3D nyomtatás
- Fujifilm X
- Ventilátorok - Ház, CPU (borda, radiátor), VGA
- Elder Scrolls IV - Oblivion - Olvasd el az összefoglalót, mielőtt írsz!
- További aktív témák...
- Microsoft Surface Pro 7 - Újszerű, dobozban, gyári töltővel, billentyűzettel
- Epson Workforce DS-530II Dokumentum szkenner
- Samsung Flip 2.0 PRO 65" WM65R + Connectivity tray + Gurulós állvány
- Wacom Cintiq DTK-2260 - Digitális rajztábla
- Macbook Pro 13" 2020, M1, 16GB RAM, 256 GB SSD, Touchbar, tökéletes álapot!
- SAMSUNG DDR4 REG ECC 32GB 2666MHz RDIMM szerver RAM modulok, nettó 15740Ft+ÁFA, 1 év gar., több db
- AKCIÓ! Apple iPad Pro 11 2024 1TB WiFi + Cellular tablet garanciával hibátlan működéssel
- BESZÁMÍTÁS! MSI B550 R9 5900X 32GB DDR4 512GB SSD RX 6700 XT 12GB Rampage SHIVA Enermax 750W
- LENOVO ThinkBook 13s - 13.3" FullHD IPS - i5-10210U - 8GB - 256GB SSD - Win11 - MAGYAR
- Xiaomi Redmi A3 64GB Kártyafüggetlen, 1Év Garanciával
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Liszt Ferenc Zeneművészeti Egyetem
Város: Budapest