Html js událost výběr položky výběr. Handler pro událost onChange objektu Select

Řekněme, že máte .net webové rozhraní API s akcí GetResource(int resourceId). Tato akce (se zadaným ID) by měla být povolena pouze pro uživatele spojeného s tímto ID (zdrojem může být například blogger napsaný uživatelem).

To se dá vyřešit různé způsoby, ale níže je příklad.

Public Resource GetResource(int id) ( název řetězce = Thread.CurrentPrincipal.Identity.Name; var user = userRepository.SingleOrDefault(x => x.UserName == název); var resource = resourceRepository.Find(id); if (zdroj .UserId != user.UserId) ( vyvolá novou výjimku HttpResponseException(HttpStatusCode.Unauthorized); ) return resource;

kde byl uživatel ověřen nějakým mechanikem.

Nyní řekněme, že také chci, aby uživatel jako admin měl právo používat koncový bod (se stejným ID). Tento uživatel nemá přímý vztah se zdrojem, ale má oprávnění kvůli jeho typu (nebo roli). To lze vyřešit jednoduše kontrolou, zda je uživatel typu Administrator, a vrácením zdroje.

Existuje způsob, jak to centralizovat, abych nemusel při každé akci psát autorizační kód?

Edit Na základě odpovědí si myslím, že bych měl svou otázku upřesnit.

Ve skutečnosti dělám mechanismus, který vám umožňuje mít autorizaci založenou na zdrojích, ale zároveň umožňuje některým uživatelům používat stejný koncový bod a stejný zdroj. Níže uvedená akce to vyřeší pro tento konkrétní koncový bod a pro toto konkrétní roli(administrátor).

Public Resource GetResource(int id) ( název řetězce = Thread.CurrentPrincipal.Identity.Name; var user = userRepository.SingleOrDefault(x => x.UserName == název); var resource = resourceRepository.Find(id); if (! user.Roles.Any(x => x.RoleName == "Admin" || resource.UserId != user.UserId) ( throw new HttpResponseException(HttpStatusCode.Unauthorized); ) return resource;

Co dostanu, je obecná metoda vyřešit tento problém, abych nemusel psát dva různé koncové body se stejným účelem nebo psát kód specifický pro zdroj na každém koncovém bodě.

4 odpovědi

Pro autorizaci založenou na zdrojích bych navrhoval použít ID založené na deklaracích a vložit ID uživatele jako nárok. Napište metodu rozšíření pro čtení nároku od jednotlivce. Ukázkový kód by tedy vypadal takto:

Veřejný zdroj GetResource(int id) ( var resource = resourceRepository.Find(id); if (resource.UserId != User.Identity.GetUserId()) ( vyvolání nové HttpResponseException(HttpStatusCode.Unauthorized); ) vrátit zdroj; )

Pokud chcete kód ještě více zjednodušit, můžete napsat UserRepository, které zná uživatelská data a úložiště zdrojů, aby bylo možné kód centralizovat. Kód bude vypadat takto:

Veřejný zdroj GetResource(int id) ( return User.Identity.GetUserRepository().FindResource(id); )

Pro autorizaci na základě rolí bude AuthorizeAttribute nejlepší místo abyste to zvládli, a je lepší k tomu použít samostatnou akci nebo ovladač.

Veřejný zdroj GetResourceByAdmin(int id) ( return resourceRepository.Find(id); )

[Edit] Pokud chce OP použít jednu akci, se kterou bude pracovat odlišné typy uživatelů, já osobně preferuji použití továrny na úložiště uživatelů. Kód akce:

Veřejný zdroj GetResource(int id) ( return User.GetUserRepository().FindResource(id); )

Metoda rozšíření bude:

Veřejné statické úložiště IUserRepository GetUserRepository(tento principál IPrincipal) ( var resourceRepository = new ResourceRepository(); bool isAdmin = principal.IsInRole("Admin"); if (isAdmin) ( return new AdminRespository(resourceRepository); ) else ( return new UserRepository(principal) .Identity, resourceRepository);

Důvod, proč nechci používat AuthorizeAttribute ke kontrole pravosti každého zdroje, je ten, že různé zdroje mohou mít různý kód pro ověření vlastnictví, je obtížné centralizovat kód do jednoho atributu a vyžaduje to další operace DB, což není opravdu nutné. Dalším problémem je, že k AuthroizeAttribute dochází před svázáním parametrů, takže se musíte ujistit, že parametr akce pochází z dat trasy. Jinak například nebudete moci získat hodnotu parametru z těla zprávy.

Musíte své oprávnění externalizovat. Chcete přesunout veškerou autorizační logiku do samostatné vrstvy nebo služby.

Existuje několik rámců - na různé jazyky- které vám to umožňují. Ve světě .NET, jak je navrženo v jiných odpovědích, máte autorizaci založenou na požadavcích. Microsoft má skvělý článek o .

  • standardní architektura s konceptem bodu rozhodování o politice (PDP je vaše autorizační služba), která může sloužit jako rozhodnutí ano/ne
  • standardní jazyk pro vyjádření autorizační logiky pomocí libovolného počtu parametrů/atributů, včetně uživatelských atributů a informací o zdrojích.
  • schéma žádost/odpověď pro zasílání vašich autorizačních otázek na PDP.

Pokud přejdeme k vašemu příkladu, budete mít něco řádek po řádku:

Public Resource GetResource(int id) ( var resource = resourceRepository.Find(id); if (isAuthorized(User.Identity,resource)) ( throw new HttpResponseException(HttpStatusCode.Unauthorized); ) return source; ) public bool isAuthorized(User u , Zdroj r)( // Zde vytvořte požadavek XACML // Zavolejte PDP // vrátíte booleovské rozhodnutí )

Váš PDP bude obsahovat následující pravidla:

  • uživatel může provést akci == pohled na zdroj tehdy a pouze tehdy, když resource.owner == user.id
  • uživatel s rolí == správce může na prostředku provést akci ==.

Výhodou XACML je, že si můžete navrhnout vlastní autorizační pravidla/logiku nezávisle na vašem kódu. To znamená, že se nemusíte dotýkat kódu aplikace pokaždé, když se změní logika. XACML si také poradí s více parametry/atributy - například ID zařízení, IP adresa, denní doba... Konečně XACML není specifické pro .NET. Funguje pro různé frameworky.

Podíval bych se na implementaci vlastního System.Web.Http.AuthorizeAttribute, který byste mohli použít na akce, které vyžadují toto konkrétní autorizační pravidlo. V autorizaci uživatele můžete povolit přístup, pokud je uživatel členem skupiny Admins nebo pokud je autorem prostředku.

ZMĚNA:

Na základě úpravy OP mi dovolte rozšířit to, co říkám. Pokud přepíšete AuthorizeAttribute, můžete přidat logiku jako:

Veřejná třída Authorizeadminsandauthors: System.web.http.authorizeattribute (chráněný přepsání bool isAuthorized (httpactionContext ActionContext) (návratový proudser.isinrole („admini“) || ISCurrentUthorofPost (ActionContext);) id pro zdroj z actionContext // vyhledejte, zda je uživatel autorem tohoto příspěvku, vrátí true)

Toto je pseudo kód, ale měl by tuto myšlenku objasnit. Pokud máte jeden AuthorizeAttribute, který definuje autorizaci na základě vašich požadavků: aktuální požadavek pochází buď od autora příspěvku, nebo od administrátora, pak můžete atribut AuthorizeAdminsAndAuthors použít na jakýkoli zdroj, kde je vyžadována tato úroveň autorizace. Váš zdroj tedy bude vypadat takto:

Veřejný zdroj GetResource(int id) ( var resource = resourceRepository.Find(id); return resource; )

Nastaví obslužnou rutinu pro výběr textu v rámci prvku nebo, nebo, spustí tuto událost. Tato událost se může vyskytovat pouze v a prvcích. Metoda má tři případy použití:

handler(eventObject) - funkce, která bude nastavena jako handler. Po zavolání obdrží objekt události eventObject .

handler(eventObject) - viz výše.
eventData - další data předaná handleru. Musí být reprezentovány objektem ve formátu: (jméno1:hodnota1, jméno2:hodnota2, ...) .

Nainstalovaný obslužný program můžete odebrat pomocí metody unbind().

Všechny tři možnosti použití metody jsou analogy jiných metod (viz výše), takže všechny podrobnosti pomocí výběru() lze nalézt v popisech těchto metod.

Při výběru textu pomocí myši prohlížeče po dokončení výběru spustí událost select. Dojde-li k výběru stisknutím kláves ← → ↓ při podržení klávesy shift, pak k události dojde při každém uvolnění klávesy se šipkou.

Chcete-li dostat vybranou část textu různé prohlížeče Požadované různé prostředky. V aplikaci FireFox a Google Chrome vybraná část bude poskytnuta metodou window.getSelection() nebo document.getSelection(), zatímco IE a Opera poskytnou požadovaný text při volání metody document.selection.createRange(). Verze pro různé prohlížeče bude vypadat takto:

funkce selectedText() ( if (window.getSelection) txt = window.getSelection().toString(); else if (document.getSelection) txt = document.getSelection(); else if (document.selection) txt = document.selection .createRange().text;return txt)

Všimněte si, že funkce selectedText() nebude fungovat pouze pro a , vrátí vybraný text bez ohledu na to, v jakém prvku (prvcích) se nachází.

Příklad

// nainstalujte handler vyberte události, prvek s identifikátorem foo $("#foo" ) .select (funkce () ( alert ("Uvnitř prvku foo, text byl vybrán uživatelem." ) ; ) ); // vyvolání události select na prvku foo $("#foo" ) .select () ; // nainstalujte další obsluhu události select, tentokrát pro prvky // s třídou block. Předáme další data obslužné rutině $(".block" ) .select (( a: 12 , b: "abc" ) , funkce (eventObject) ( var externalData = "a=" + eventObject.data .a + ", b= " + eventObject.data .b ; alert ("Text byl vybrán uvnitř prvku s třídou bloku" + "Data byla předána obsluze této události: " + externalData ) ; ) );

seznam může být buď s možností vybrat pouze jednu možnost, nebo několik možností.

Každý kontejner je přidružen k objektu třídy Select a každý podřízený kontejner je přidružen k objektu třídy Option, což je vlastnost tohoto objektu třída Vybrat. Vlastností objektu třídy Select je navíc také kolekce voleb, která seskupuje všechny její podřízené objekty Option. Uveďme si hlavní vlastnosti, metody a události, které tyto objekty charakterizují.

Vyberte objekt Vlastnosti Metody Obslužné rutiny událostí

možnosti velikost délka násobek vybranýchIndex

focus() blur() add() remove()

onBlur onChange onFocus

Objekt volby Vlastnosti Metody Události

defaultVybrána vybraná textová hodnota indexu

Ne Ne

Nebudeme popisovat všechny vlastnosti, metody a události těchto dvou objektů. Zastavme se u typickými způsoby pomocí jejich kombinací.

Vytváření objektů Option

Objekt třídy Option je zajímavý, protože na rozdíl od mnoha jiných je integrován do DOM JavaScript objekty, má konstruktéra. To znamená, že programátor může sám vytvořit objekt třídy Option:

opt = new Option([ text, [ hodnota, [ defaultSelected, [ selected ]]]]);

kde argumenty odpovídají vlastnostem běžných objektů třídy Option:

  • text - řádek textu, který je umístěn v kontejneru (například: text);
  • hodnota – hodnota, která je předána serveru při výběru alternativy spojené s objektem Option;
  • defaultSelected - zda je tato alternativa vybrána ve výchozím nastavení (true / false);
  • vybráno - alternativa byla vybrána uživatelem (pravda / nepravda).

Na první pohled není příliš jasné, proč může programátor takový objekt potřebovat, protože nelze vytvořit objekt třídy Select a nelze mu tedy přiřadit nový objekt Option. Vše je vysvětleno, pokud jde o změnu seznamu alternativ pro objekt Select v dokumentu. To lze provést a změna seznamu Výběr alternativ nevede k přeformátování dokumentu. Změna seznamu alternativ umožňuje vyřešit problém vytváření vnořených nabídek, které neexistují ve formulářích HTML, programováním běžné menu(možnosti).

Při programování alternativ byste měli věnovat pozornost skutečnosti, že objekty třídy Option nemají vlastnost name, protože kontejner nemá Atribut NAME. K objektům Option vloženým do dokumentu lze tedy přistupovat pouze jako členové kolekce voleb.

Možnosti sběru

Vestavěné možnosti pole (kolekce) jsou jednou z vlastností objektu Select. Prvky tohoto pole jsou plnohodnotnými objekty třídy Option. Vytvářejí se při načítání stránky prohlížečem. Počet objektů Option obsažených v objektu document.f.s třídy Select lze zjistit pomocí standardní nemovitost pole: document.f.s.options. délka. Navíc samotný objekt Select má stejnou vlastnost: document.f.s. délka - je zcela identická s předchozím.

Programátor má možnost nejen vytvářet nové objekty Option, ale také mazat objekty již vytvořené prohlížečem:

První možnost Druhá možnost Třetí možnost 5.3. Odebírání možností z SELECT

V v tomto příkladu Při načítání stránky ze serveru máme tři alternativy. Ty lze zobrazit jako rozevírací seznam možností. Po kliknutí na tlačítko "Smazat". poslední možnost"ve formuláři zbývají pouze dvě alternativy. Pokud na toto tlačítko znovu kliknete, zůstane pouze jedna alternativa. V konečném důsledku nezbudou vůbec žádné možnosti, tj. uživatel ztratí možnost výběru. Když tlačítko reset stisknete, možnosti se neobnoví - alternativy se ztratí beze stopy.

Nyní můžeme pomocí konstruktoru Option učinit proces reverzibilním:

function RestoreOptions() ( document.f.s.options = new Option("Option one","",true,true); document.f.s.options = new Option("Option two"); document.f.s.options = new Option("Option tři"); return false; ) První možnost Druhá možnost Třetí možnost 5.4. Odebírání a přidávání možností z SELECT

Obnovu alternativ jsme umístili do obsluhy události onReset kontejneru FORM. Vytvořené objekty třídy Option, kterou přiřadíme objektu document.f.s třídy Select. V tomto případě musí být ve výchozím nastavení vybrána první alternativa (argument defaultSelected je nastaven na hodnotu true), aby se simulovalo chování při bootstrap stránky.

Vlastnosti textu a hodnoty objektu Option

Vlastnost text představuje text zobrazený v nabídce, který odpovídá alternativě. V kódu HTML se nachází mezi značkami a. Vlastnost value obsahuje hodnotu atributu VALUE značky. Řekněme například, že jedna z možností v seznamu byla popsána jako:

Možnost jedna

Potom hodnota vlastnosti textu odpovídající objekt bude mít "Option One" a vlastnost value bude mít "n1".

Nabízí se otázka, proč jsou potřeba dvě vlastnosti? Faktem je, že hodnota vybrané možnosti se přenese na server. V případě, že kontejner nemá atribut VALUE, je na server odeslán text hodnoty .selectedIndex, který vrátí index první vybrané možnosti. V tomto případě existuje alternativa: vybraná vlastnost na každém objektu Option. Je pravda, pokud tato možnost je vybráno a v opačném případě má hodnotu false. Příklad bude uveden níže.

Obsluha události objekt onChange Vybrat

K události Change dojde, když uživatel změní svůj výběr možností. Pokud je pole výběrové pole s jednou možností, pak je vše jednoduché – viz předchozí příklad. Podívejme se, co se stane, když se zabýváme polem s více možnostmi:

Ovoce: jablko banán kiwi broskev
Vybrané pozice: 5.5. onChange handler pro více výběrů

Všimněte si, že událost Change nastane, když uživatel vybere nebo zruší výběr možnosti. Výjimkou je situace, kdy jsou možnosti označeny postupně během výběru (klepnutí tlačítka myši na jeden prvek, najetí myši na konečný prvek, uvolnění tlačítka myši). V tomto případě k události dojde, když uživatel uvolní tlačítko myši a všechny označené alternativy se stanou vybrány.

vlastnosti vybraných a vybranýchIndex

Vlastnosti textu a hodnoty objektu Option

Vlastnost text představuje text zobrazený v nabídce, který odpovídá alternativě. V kódu HTML se nachází mezi značkami a. Vlastnost value obsahuje hodnotu atributu VALUE značky. Řekněme například, že jedna z možností v seznamu byla popsána jako:

Možnost jedna

Potom bude hodnota vlastnosti text odpovídajícího objektu rovna „Option one“ a hodnota vlastnosti value bude rovna „n1“.

Nabízí se otázka, proč jsou potřeba dvě vlastnosti? Faktem je, že hodnota vybrané možnosti se přenese na server. Pokud kontejner nemá atribut VALUE, textová hodnota se odešle na server.

Vlastnost selectedIndex objektu Select vrací číslo vybrané možnosti (číslování začíná od nuly).

Možnost: Index OneTwoChoose:

Všimněte si, že v obsluze události onChange odkazujeme na druhý prvek formuláře. Na tento moment není definováno, ale událost nastane pouze tehdy, když vybereme možnost - v této době již bude pole definováno.

Pokud je seznam možností uveden jako , tzn. s možností vybrat více možností najednou vrátí vlastnost selectedIndex index první vybrané možnosti. V tomto případě existuje alternativa: vybraná vlastnost každého objektu Option. Je to pravda, pokud je tato možnost vybrána, jinak nepravda. Příklad bude uveden níže.

K události Change dojde, když uživatel změní svůj výběr možností. Pokud je pole výběrové pole s jednou možností, pak je vše jednoduché – viz předchozí příklad. Podívejme se, co se stane, když se zabýváme polem s více možnostmi:

Ovoce: jablečné konzervy, vipeach
Vybrané položky:

Příklad 5.5. onChange handler při výběru více možností (html, txt)

Všimněte si, že událost Change nastane, když uživatel vybere nebo zruší výběr možnosti. Výjimkou je situace, kdy jsou možnosti označeny postupně během výběru (klepnutí tlačítka myši na jeden prvek, najetí myši na konečný prvek, uvolnění tlačítka myši). V tomto případě k události dojde, když uživatel uvolní tlačítko myši a všechny označené alternativy se stanou vybrány.




Horní