Avatar billede pigbear Nybegynder
02. januar 2009 - 19:19 Der er 16 kommentarer

kalde .net funktion hentet fra database

Hej,
Er det muligt at kalde en funktion der er del af .net miljøet i c#. Det jeg vil er at man i html kode kan skrive fx en string funktion, som bliver afviklet serverside, og resultatet af den bliver send ud sammen med mit site.

Udfordringen er at jeg har mine html tags liggende i min database, og der henter jeg så min html kode der bliver sendt til clienten. I mine text tags vil jeg så have mulighed for at skrive
<input type="text" name="dato" value="en .net funktion">

mvh

pigbear
Avatar billede arne_v Ekspert
02. januar 2009 - 19:24 #1
Det er jo ikke "the .NET way".

1)  rigtig web form med TextBox
2)  en HTML kontrol

hvor du saetter VALUE i Page_Load.

Hvis du vil lave noget snavs, saa var det en mulighed at du lave noget soeg og erstat
paa det du henter ud fra databasen. Regex.Replace kunne formentligt bruges.
Avatar billede arne_v Ekspert
02. januar 2009 - 19:25 #2
Du skal saa enten have en metode med switch paa funktions navn eller over i noget
dynamisk/eval lignende.
Avatar billede pigbear Nybegynder
02. januar 2009 - 19:47 #3
Ja jeg ved det er noget snavs, men brugerne skriver almindelig html so bliver gemt i databasen, hvorefter html´en bliver knyttet til et sitemap, som de så fremover klikker på og får så vist html´en i browseren. Text input værdierne bliver brugt som parametre til en database forespørgsel, og jeg ville frygtelig gerne have det sådan at man fx kan skrive en funktion i value på inputfelterne således at man fx får datoen for idag i feltet eller dato-1 for i går.
Avatar billede arne_v Ekspert
02. januar 2009 - 20:10 #4
Til inspiration:

using System;
using System.Text.RegularExpressions;

namespace E
{
    public class Program
    {
        private static string Convert(string s)
        {
            switch(s)
            {
                case "dato":
                    return DateTime.Now.ToString("dd-MM-yyyy");
                case "dato-1":
                    return DateTime.Now.AddDays(-1).ToString("dd-MM-yyyy");
                default:
                    throw new ArgumentOutOfRangeException("Unknown function");
            }
        }
        private static readonly Regex re = new Regex("(?:@@)(.*?)(?:@@)", RegexOptions.Compiled);
        public static string Process(string s)
        {
            string res = s;
            foreach(Match m in re.Matches(s))
            {
                res = res.Replace(m.Groups[0].Value, Convert(m.Groups[1].Value));
            }
            return res;
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(Process("<input type='text' name='dato' value='@@dato@@'>"));
            Console.WriteLine(Process("<input type='text' name='dato' value='@@dato-1@@'>"));
            Console.ReadKey();
        }
    }
}
Avatar billede pigbear Nybegynder
02. januar 2009 - 20:18 #5
Hej igen, tak for svar
løsningen kan godt laves sådan, men jeg havde håbet på at man kunne anvende .net ´s tilgængelige funktioner, uden at implementere dem med case sætningen som du gør i eksemplet...
Avatar billede arne_v Ekspert
02. januar 2009 - 20:20 #6
Det kan du ogsaa. Jeg modificerer lige eksemplet.
Avatar billede arne_v Ekspert
02. januar 2009 - 20:31 #7
using System;
using System.Text.RegularExpressions;
using System.Reflection;
using System.CodeDom.Compiler;

using Microsoft.JScript;

namespace E
{
    public interface IJS
    {
        string Eval(string expr);
    }
    public class JS
    {
        private static IJS engine;
        static JS()
        {
            string src = "import System; import E; public class C implements IJS { public function Eval(expr : String) : String { return eval(expr); } }";
            CodeDomProvider comp = new JScriptCodeProvider();
            CompilerParameters param = new CompilerParameters();
            param.GenerateInMemory = true;
            param.ReferencedAssemblies.Add("System.dll");
            param.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().Location);
            CompilerResults res = comp.CompileAssemblyFromSource(param, src);
            Assembly asm = res.CompiledAssembly;
            engine = (IJS)asm.CreateInstance("C");
        }
        public static string Eval(string expr)
        {
            return engine.Eval(expr);
        }
    }
    public class Program
    {
        private static readonly Regex re = new Regex("(?:@@)(.*?)(?:@@)", RegexOptions.Compiled);
        public static string Process(string s)
        {
            string res = s;
            foreach(Match m in re.Matches(s))
            {
                res = res.Replace(m.Groups[0].Value, JS.Eval(m.Groups[1].Value));
            }
            return res;
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(Process("<input type='text' name='dato' value='@@DateTime.Now.ToString(\"dd-MM-yyyy\")@@'>"));
            Console.WriteLine(Process("<input type='text' name='dato' value='@@DateTime.Now.AddDays(-1).ToString(\"dd-MM-yyyy\")@@'>"));
            Console.ReadKey();
        }
    }
}
Avatar billede pigbear Nybegynder
02. januar 2009 - 20:41 #8
Uha, det begynder at se avanceret ud, jeg må til at prøve det i visual studio og se om jeg kan få det til at du´e

mange tak forløbig

mvh

pigbear
Avatar billede pigbear Nybegynder
04. januar 2009 - 15:19 #9
Hej igen,

Jeg har nu prøvet dit eksempel. Jeg kan ikke finde using Microsoft.JScript;
så jeg anvendte istedet using Microsoft.CSharp;
og så erstattede jeg CodeDomProvider comp = new JScriptCodeProvider(); med CodeDomProvider comp = new CSharpCodeProvider(); og det ser ud til at fungere.

Jeg får dog en fejl i Process funktionen:
res = res.Replace(m.Groups[0].Value, JS.Eval(m.Groups[1].Value));
.. fejlen er som følger:

The type initializer for 'E.JS' threw an exception. System.Collections.ListDictionaryInternal

Er der noget galt med grupperne i det regulære udtryk, eller hvad tror du er galt ?

mvh

Pigbear
Avatar billede arne_v Ekspert
04. januar 2009 - 15:23 #10
Du skal have en ref til vjslib.dll !
Avatar billede arne_v Ekspert
04. januar 2009 - 15:24 #11
vrøvl

DU skal have en ref til Microsoft.JScript.dll !
Avatar billede arne_v Ekspert
04. januar 2009 - 15:25 #12
Og C# duer ikke da hele tricket hænger på JScript Eval funktionen.
Avatar billede pigbear Nybegynder
04. januar 2009 - 16:25 #13
Da jeg skriver: using Microsoft.JScript;, får jeg en fejl da JScript ikke findes i namespace microsoft.

Vil det sige at det kan ikke laves i c#, eller skal jeg blot have en reference til jscript ?, og hvis det er tilfældet hvor får jeg den dll fil fra ?
Avatar billede arne_v Ekspert
04. januar 2009 - 17:35 #14
sæt ref til Microsoft.JScript.dll

den kommer med .NET
Avatar billede pigbear Nybegynder
05. januar 2009 - 02:44 #15
Hej igen,

Du er genial, det virker. Jeg har prøvet det i et consol program, men jeg skal bruge løsningen i en website.

Når jeg implementerer løsningen i min aspx side fungerer det ikke.
Jeg får følgende fejl:
Could not load file or assembly 'file///c:\en path\temp\ubl3d8hm og en anden fil kaldet rcwhtqhc.dll

Har du notet bud på hvad der kan være galt ?

mvh

Pigbear
Avatar billede arne_v Ekspert
11. januar 2009 - 04:17 #16
Jeg kan godt få det til at virke i ASP.NET sammenhæng.

using System;
using System.Text.RegularExpressions;
using System.Reflection;
using System.CodeDom.Compiler;

using Microsoft.JScript;

namespace E
{
    public interface IJS
    {
        string Eval(string expr);
    }
    public class JS
    {
        private static IJS engine;
        static JS()
        {
            string src = "import System; import E; public class C implements IJS { public function Eval(expr : String) : String { return eval(expr); } }";
            CodeDomProvider comp = new JScriptCodeProvider();
            CompilerParameters param = new CompilerParameters();
            param.GenerateInMemory = true;
            param.ReferencedAssemblies.Add("System.dll");
            param.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().Location);
            CompilerResults res = comp.CompileAssemblyFromSource(param, src);
            Assembly asm = res.CompiledAssembly;
            engine = (IJS)asm.CreateInstance("C");
        }
        public static string Eval(string expr)
        {
            return engine.Eval(expr);
        }
    }
    public static class Util
    {
        private static readonly Regex re = new Regex("(?:@@)(.*?)(?:@@)", RegexOptions.Compiled);
        public static string Process(string s)
        {
            string res = s;
            foreach(Match m in re.Matches(s))
            {
                res = res.Replace(m.Groups[0].Value, JS.Eval(m.Groups[1].Value));
            }
            return res;
        }
    }
}

buildes til Eval.dll og smides i bin dir.

<%@ import namespace="E" %>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
    result.Text = Util.Process("bla bla @@DateTime.Now.ToString()@@ bla bla ");
}
</script>
<asp:label id="result" runat="server"/>

viser så det som den skal.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester