Új hozzászólás Aktív témák
-
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 ]
-
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...[ Szerkesztve ]
-
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);--= Zalán =--
-
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 ]
-
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);[ Szerkesztve ]
-
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ó.
[ Szerkesztve ]
-
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[ Szerkesztve ]
-
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.Én kérek elnézést!
-
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...
[ Szerkesztve ]
-
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
-
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
-
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
-
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...
[ Szerkesztve ]
-
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.Én kérek elnézést!
-
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);
}
}[ Szerkesztve ]
-
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.
Meizu MX3 32GB
-
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!
Meizu MX3 32GB
-
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...
[ Szerkesztve ]
-
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.
[ Szerkesztve ]
-
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.
[ 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...
-
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...
[ Szerkesztve ]
-
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.Én kérek elnézést!
-
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...
[ Szerkesztve ]
-
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.
Én kérek elnézést!
-
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'.[ Szerkesztve ]
-
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 =--
-
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).
[ Szerkesztve ]
-
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.'
[ Szerkesztve ]
-
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).
[ Szerkesztve ]
-
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.
Én kérek elnézést!
Ú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!
- Indiana Jones and the Great Circle - Digital Premium Edition - beváltás: 2025.1.30 - RTX 40XX
- Noblechairs Icon black (Karácsony előtt olcsóbban!) A gamer székek királya!
- iPad Pro 2018 12,9 256GB wifi+cellular 1 éves cégtől 12 hónap szavatosság
- ASUS MAXIMUS VIII GENE Z170 Alaplap!
- Intel Core i7-6700K 4-Core 4GHz LGA1151 (8M Cache, up to 4.20 GHz) Processzor
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Axon Labs Kft.
Város: Budapest