Diskuze: ASP.NET MVC Předávání dat
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
V ASP.NET MVC jsem musel tomu parametru pro předání přidat nějakou hodnotu, např.
return RedirectToAction("MyRequests", "Requests", new { id = prihluziv });
v Core se to dělá jinak?
Takhle se dají bohužel předávat pouze textové hodnoty, nebo ne?
Já potřebuju předávat vlastní datový typ.
Našel jsem řešení pomocí přetížení Session
public static class SessionExtensions
{
public static void SetObjectAsJson(this ISession session, string key, object value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static T GetObjectFromJson<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
}
Nevím jestli je to ideální řešení protože je tam určitý timeout, a
nevím jak přesně funguje.
Timeout se týká celé Session (tzn. Počítá se od spuštění aplikace a po
ulynutí se celá vymaže, nebo se počítá od vytvoření konkrétního
objektu a po uplynutí se vymaže jen ten konkrétní objekt?
Jaká je rozdíl mezi Session a TempData? Nebylo by použití TempData
vhodnější?
Ještě jsem narazil na problém s globální proměnou. Existuje způsob jak jí v rámci controlleru např. v Action Index přiřadit hodnotu a později při zavolání jiné akce tu hodnotu načíst?
Session bych v tomto případě asi nepoužil, protože to lze na prohlížeči "vypnout" a v tu chvíli by ti to přestalo fungovat.
TempData je good nato...Sprav si extension na TemData a potom budes volat vnutry controlleru
public static class TempDataExtensions
{
public static T DeserializeToObject<T>(this ITempDataDictionary tempData, string key) where T : new()
{
string entry = tempData[key]?.ToString();
T result = (entry == null) ? new T() : JsonConvert.DeserializeObject<T>(entry);
return result;
}
public static void SerializeObject<T>(this ITempDataDictionary tempData, T obj, string key)
{
tempData[key] = JsonConvert.SerializeObject(obj, Formatting.Indented);
}
}
V controlleru potom volas this.TempData.SerializeObject(TVUJ
OBJECT, KLUC)....Spatky to dostanes obdobne
this.TempData.DeserializeToObject<TVOJ
OBJECT>(KLUC)....Nejsem si isty ci v asp.net core 5.x uz ide
predavat aj object, tady sa to roby cez JSON...Ten object je potom dostupni
globalne v celem projekte a zanikde az si ho nekdo vipita cez kluc, dovtedy by
ho mali TempData drzat...SNad pomohlo
Ještě jsem narazil na problém s globální proměnou.
Globalne promnene nepouzivaj, v Core a ASP je uplne super podpora pro DI, pouzi raci to ked uz
Díky,
tohle funguje dobře a pokud se to ještě takto upraví je z toho trvalá
globální proměnná
public static T DeserializeToObject<T>(this ITempDataDictionary tempData, string key) where T : new()
{
string entry = tempData[key]?.ToString();
T result = (entry == null) ? new T() : JsonConvert.DeserializeObject<T>(entry);
SerializeObject<T>(tempData, result, key);
return result;
}
To je zbytecnem pouzi DI...
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddScoped<ITvojObjekt, TvojObjekt>();
// ...
}
TvojObjekt.cs
public interface ITvojObejkt
{
// ...
}
public class TvojObjekt: ITvojObjekt
{
// ...
}
Controller.cs
private readonly ITvojObjekt tvojObjekt;
public Controller(ITvojObjekt tvojObjekt)
{
this.tvojObjekt = tvojObjekt;
}
Je to lepsi lebo takto stale serialicujes a deserializujes ten objekt a
vytvaras novy... TempData neni nato, nato je DI... Takto budes mnet len jeden
objekt dostupni v kazdem controllery co si ho necha vstriknut... Controller
netreba pridavat do servce ti uz tam su
Pokad chces predat objekt pouzi TempData...
Pokad chces globalny objekt pouzi DI...
Můžeš mi to prosím ukázat konkrétněji.
Řekněme, že potřebuju tenhle vlastní objekt v jednom controlleru nastavit a takto nastavený ho mít k dispozici v ostatních controllerech
public class Nastaveni
{
public string Textik {get; set;}
public int Cislo {get; set;}
}
No...ne, to je cele
Vyment TvojObjekt.cs za Nastaveni.cs a Controller.cs su ti tvoje
kontrolery....To je secko....Tady mas doc skus si pozret to
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<INastaveni, Nastaveni>();
services.AddControllersWithViews();
}
Models/Nastaveni.cs
public interface INastaveni
{
// ...
}
public class Nastaveni: INastaveni
{
public string Text { get; set; }
public int Cislo { get; set; }
}
Controllers/Home.cs
private readonly INastaveni nastaveni;
public Controller(INastaveni nastaveni)
{
this.nastaveni = nastaveni;
}
public Controller(INastaveni nastaveni) hlásí chybu CS1520 Metoda musí mít typ vrácené hodnoty.
ty si ten controller pomenoval jak??? HomeController, neco??....stej chyby mi vypliva ze si len do tvojeho controlleru vlozil ten muj kod....takto si vitvoril metodu a navratovi tip je controller....mnel to byt len priklad...to public Controlelr(Ineco neco), je konstrukt tvojeho kontroleru...tam si nechas to DI vstriknut....neni to metoda v kotroleru
Promiň já jsem ten přípsěvek zpětně opravoval, ale asi se
neuložil.
Chybu jsem zvládl opravit, pořád to ale nefunguje.
Když v metodě jednoho controlleru tomu nastaveni přiřadím hodnoty, tak v
jiném kontrolu má nastavení výchozí hodnoty.
Jakým způsobem to nastavení předám jinému controlleru?
Aha asi sem spravil chybu ja...Skus pouzit AddSingleton<>()...Ak to nepujde napis mi a posly aj kod, lebo inak nevim
Problem bude asi toto stackoverflow ...DI ti pokazde vytvori novu instanci...Takto by si mal mat len jednu
Mozno este keby vytvoris sam tu instancy Nastaveni.cs a regnes ju v DI a DI si ju ulozi a pak ju vstrikuje do Controlleru...Kazdooadne pointa je vtem ze DI drzi len tu jednu instanci a kazdemu kdo si ju vipita ju da...Potom ked neco vni zmenis odkadkolvek tak sa to zmeni globalne lebo vseci sa odkazuju len na tu jednu instanci....Mnelo by to ist
Tak to vypadá že po nahrazení
services.AddScoped<INastaveni, Nastaveni>();
za
services.AddSingleton<INastaveni, Nastaveni>();
se to chová přesně tak jak potřebuji (jako jedna proměná pro celý projekt)
Tak jsem se dostal k testování server-client v lokální síti a bohužel
se to chová tak, že všichni clienti přebírají stejné nastavení.
To znamená, že pokud si jeden client něco v nastavení upraví, promítne se
to všem ostatním clientům.
Já, ale logicky potřebuji aby každý client používal své vlastní
nastavení.
Ahoj. Reaguješ na půl roku starý příspěvek. Vytvoř si prosím nové vlákno.
Zobrazeno 19 zpráv z 19.