Laden...

Forenbeiträge von Curse4Life Ingesamt 452 Beiträge

06.07.2013 - 14:09 Uhr

Hi,

ich habe ein kleines aber nützliches Tool geschrieben, was erst nur zur Übung für mich gedacht war und um meinen Workflow ein wenig zu erleichtern habe ich jetzt als mein erstes NuGet package veröffentlicht und auf GitHub.

Was das Tool macht ist wirklich simpel, ich wollte das automatisch in einem Projekt nach dem Build ein NuGet package erstellt wird mit der Version, die nicht etwa in der .nuspec Datei angegeben ist, sondern mit der Version die in der "AssemblyInfo.cs" Datei angegeben ist.

Und genau das macht das Tool.
Es liegt eine Readme Datei bei, die den Umgang damit erklärt, vielleicht kann ja einer von euch noch dieses Tool gebrauchen.

Hier ist der NuGet Link:
https://nuget.org/packages/XdX.CVNuPackage/

Würde mich über Kommentare freuen.

Beste Grüße

EDIT:
Habe Version 1.0.1 hochgeladen die nur eine verbesserte Readme.txt hat.

13.06.2012 - 13:25 Uhr

Schon klar, ich will es ja auch nicht verkaufen und mir das Geld in die Tasche stecken, sondern nur verhindern das es einen Klon gibt.

Ich habe gerade mal Closed Source gegoogled, ich dachte das wäre quasie das üblich, das ich an etwas entwickel und gut ist.

Aber das ist ja gar nicht so, Closed Source kann ja auch mit öffentlichem Quellcode sein, an dem Leute mitarbeiten.

Dann scheint das in der Tat das zu sein, was ich suche.
Was gibt es dann da für welche?

13.06.2012 - 13:09 Uhr

Das letzte klingt gut, der Code soll in keinem anderen Projekt Verwendung finden!
Was dem Projekt beigesteuert wird soll auch da bleiben (Inklusive meinem Code), dann möchte ich das Projekt irgendwann veröffentlichen (Eine Webseite) und gut ist.

Lehrzwecke sind natürlich immer in Ordnung, ich will halt nur verhindern das jemand meine Idee klaut und einen Klon erstellt/verkauft.

13.06.2012 - 12:46 Uhr

Hi an alle,

ich habe eine Frage zu Lizenzarten.
Und zwar würde ich gerne ein Open Source Projekt auf Codeplex starten und ich bräuchte eine Lizensart die folgende Dinge abdeckt.

Wie gesagt, es soll ein Projekt auf CodePlex werden.

  • Natürlich sollen Leute daran mitentwickeln können, sonst würde ein OpenSource Projekt ja keinen Sinn machen.
  • Die Codeschnippsel die andere dann zu dem Projekt dazu steuern sollen dann rechtlich dem Projekt gehören.
  • Und ganz wichtig natürlich soll der SourceCode NICHT für andere Projekte benutzt werden, also man nehme den Sourcecode, ändert den Namen und veröffentlicht dann quasie einen Klon des Projektes.

Leider habe ich per Google keine gute Übersicht über Lizenzen gefunden und bei CodePlex lassen sich so viele auswählen das ich völlig erschlagen bin.
Ich hoffe einer von euch kann Licht in dieses Gebiet bringen.

Beste Grüße

18.11.2011 - 09:08 Uhr

@dN!3L

Ahhhhhh, super auf so eine Antwort hatte ich gehofft, wieder was gelernt!
Das .Compile() hatte ich mir irgendwo im Internet abgeschaut!

Funktioniert auch super, habs schon getestet, ich danke dir! Auch für die Erklärung was passiert und warum es so passiert!

18.11.2011 - 08:46 Uhr

Nee, das ist nicht das Problem, an der Stelle will ich ja die ANZAHL aller Datensätze das ist schon OK.

Wenn ich die Zeile auskommentiert habe kriege ich ja 38.000 zurück und das sofort ohne Verzögerung, wenn ich das Where aber drin habe, dann dauert das Count 2-3 Sek. obwohl (theoretisch) nur die Zahl 117 geladen wird.

Und Count gibt ja auch nur die Anzahl zurück und dafür muss kein Datensatz geladen werden, ist ja das SQL Statement "SELECT Count(*) FROM Besuchsberichte..."

EDIT:
Zur Erklärung 38.000 Besuchsberichte insgesamt, 117 mit der KundenNr = 12345.

18.11.2011 - 07:01 Uhr

verwendetes Datenbanksystem: MS SQL 2008

Ich habe ein Problem und weiß nicht so recht woran es liegt, ich konnte es zwar auf eine Zeile eingrenzen, aber ich weiß nicht genau was da schief läuft.

Erst mal die DB/Code First Rahmeninfos.
Eine Tabelle und ein CodeFirst Model "Besuchsberichte", dieses Besuchsberichtsmodel hat ein paar Eigenschaften unter anderem die KundenNr, die aussagt bei welchem Kunden der AD war wozu er den Besuchsbericht geschrieben hat.
Die Tabelle hat ca. 38.000 Datensätze.

So weit so gut, jetzt habe ich mir eine Methode geschrieben die so aussieht:


public static IQueryable<TModel> Apply<TModel>(IQueryable<TModel> queryable, IInputModel inputModel, out Int32 allRowsCount)
		{
			var param = Expression.Parameter(typeof(TModel), "item");			
			BinaryExpression finalExpression = null;
			Expression<Func<TModel, Boolean>> finalLambdaExpression = null;


			// Jede Property durchgehen und schauen ob sie != null ist
			foreach (var loopProp in inputModel.GetType().GetProperties())
			{
				if (loopProp.Name != "OrderBy" && loopProp.Name != "OrderDescending" && loopProp.Name != "TopX" && loopProp.Name != "Skip" && loopProp.Name != "AllRowsCount" && loopProp.Name != "IncludeNavigationProperties")
				{
					Type propType = typeof(TModel).GetProperty(loopProp.Name).PropertyType;
					var propValue = loopProp.GetValue(inputModel, null);
				
					
					if (propValue != null)
					{						
						var property = Expression.Property(param, loopProp.Name);
						
						var equalExpression = Expression.Equal(property, Expression.Constant(propValue, propType));

						if (finalExpression == null)
						{
							finalExpression = equalExpression;							
						}
						else
						{
							finalExpression = Expression.AndAlso(finalExpression, equalExpression);							
						}												
					}
				}				
			}


			// Die finale LambdaExpression bilden
			finalLambdaExpression = Expression.Lambda<Func<TModel, Boolean>>(finalExpression, param);
// Übeltäter			
queryable = queryable.Where(finalLambdaExpression.Compile()).AsQueryable();


			// Anzahl aller Datensätze laden, bevor "Skip" und "TopX" angewendet wird
			allRowsCount = queryable.Count();


			// Am Ende noch sortieren wenn gewünscht
			if (!String.IsNullOrEmpty(inputModel.OrderBy))
			{
				queryable = Sort(queryable, inputModel.OrderBy, inputModel.OrderDescending);
			}


			// Skippen wenn gewünscht
			if (inputModel.Skip.HasValue && inputModel.Skip.Value > 0)
			{
				queryable = queryable.Skip(inputModel.Skip.Value);
			}


			// Nur die gewünschten Einträge zurück geben
			if (inputModel.TopX.HasValue)
			{
				queryable = queryable.Take(inputModel.TopX.Value);
			}
			

			return queryable;
		}

Wenn man sich mit Expression Trees auskennt kein Voodoo.
Diese Methode bekommt in unserem Fall jetzt eine IQueryable<Besuchsbericht> und ein InputModel, dieses InputModel hat ein Basismodel mit Eigenschaften wie Sortierung, Skip und Top und das Model selber hat in unserem Fall jetzt eine Eigenschaft mit dem Namen KundenNr.

Was ich jetzt machen will ist, schauen ob KundenNr des InputModel != null ist, wenn das so ist, einen Where Filter auf die Queryable ausführen und das natürlich dynamisch auf unendlich viele Eigenschaften.

Jetzt kommt die Krux!
Es funktioniert einwandfrei!

ABER

Uns ist jetzt aufgefallen das das laden von 4 (Gemacht durch Skip und Take) Besuchsberichten 2-3 Sekunden dauert und wenn man das SQL auf dem Server direkt ausführt ist es sofort da!
Wir also mit dem SQL Profiler geschaut was Linq abschickt und Linq holt sich ALLE 38.000 Datensätze und wendet das Skip und Take dann erst lokal an!

Die Zeile an der das liegt ist:


queryable = queryable.Where(finalLambdaExpression.Compile()).AsQueryable();

Wenn ich diese auskommentiere habe ich zwar keine Where Bedingung mehr, aber das Skip und Take werden wirklich schon auf SQL Basis ausgeführt!

Und das .Count() ist sofort durch und das dauert mit der Zeile halt die 2-3 Sek.

Habt ihr eine Erklärung dafür, ich bleibe doch die ganze Zeit auf IQueryable Ebene und damit Linq to SQL Ebene, aber es scheint halt so als würde diese eine Zeile dafür sorgen das ich halt alle Datensätze lade und lokal erst die ganzen Filter anwende.

Ich hoffe ihr habt Rat

13.11.2011 - 07:57 Uhr

Du kannst zwar MVC sagen, dass er in weiteren Ordnern nach Views schauen soll (siehe Fehlermeldung wenn eine View nicht gefunden wird) aber er wird weiterhin in den Standardordnern suchen. Für die Performance ist also Dein Vorgehen - außer die gehst auf absolute Pfade - kontraproduktiv.

Das ist nicht korrekt, wie ich in einem Debugmarathon vor Wochen schmerzlich feststellen musste wird im Release Modus und nur da, die View/Pfad nach dem ersten finden gecached, also sollte er wirklich beim ersten mal auch einmal im Standardverzeichnis suchen, dann sollte das kein Problem sein.

Mit der web.config werde ich mal schauen was ich mache.

12.11.2011 - 10:10 Uhr

Hallo,

ich baue mir ein kleines Framework basierend auf MVC 3 und will in meinen Projekten eine andere Ordnerstruktur.
So weit kein Problem, ich weiß wie ich die Viewerstellung und das suchen nach Views in andere Ordner verschiebe, es gibt nur eine Sache bei der ich nicht bescheid weiß.

Im Views Ordner liegt ja die web.config, in der steht ja unter anderem die Basisview für die Razorviews drin, dass ist in meiner neuen Struktur die einzigste Datei im Views Ordner.

Jetzt die Frage, kann ich diese web.config irgendwie verschieben, in die Root Web.config intergrieren, oder sonst was, damit ich den Views Ordner dann löschen kann?

Liebe Grüße

12.10.2011 - 13:41 Uhr

Ist auch anscheinend ein Bug, hier ein paar Adressen zu dem Problem:

http://fuchangmiao.blogspot.com/2008/12/deleting-subdirectory-restarts.html

Bug fix – Application restarts on directory delete in ASP.net

Stop IIS AppDomain Restarts When a Folder is Deleted

Bin ich ja froh und auch ein bisschen stolz das ich "Abt" mal etwas neues erzählen konnte 😃

12.10.2011 - 13:23 Uhr

Ahh, ich habe noch mal gegoogelt und das Problem das diese Funktion löst ist, wenn man Verzeichnisse die Projektverzeichnis liegen löscht, dann startet die Applikation neu, also würdest du beispielsweise anders als Facebook, wenn der User sein Profil löscht, auch das Bilderverzeichnis des Users löschen, dann startet die Applikation neu!

12.10.2011 - 12:59 Uhr

warum sollte die Webanwendung neu starten?

Warum weiß ich nicht, es gibt aber extra diesen Trick, das Verhalten auszuschalten, aber das ist mir ein bisschen zu krass ins System reingefummelt!

Und suche deshalb nach einer sanften Alternative


PropertyInfo propInfo = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
			object o = propInfo.GetValue(null, null);
			FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
			object monitor = f.GetValue(o);
			MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic);
			m.Invoke(monitor, new object[] { });

12.10.2011 - 09:05 Uhr

Hallo,

die Frage geht an alle die schon mal ein .NET Webprojekt veröffentlicht haben.

Ich habe ein Projekt bei dem die User Profilbilder hochladen können, diese möchte natürlich gerne im Dateisystem speichern, aber ich habe das Problem, das die Webanwendung dann immer neu startet.

Gibts ein Magic Verzeichnis das dieser IIS Watcher nicht abtastet, oder muss man das irgendwie per Web.config konfigurieren?
Oder muss es oberhalb des Projektverzeichnisses sein, was aber ja blöd wäre, da a die Relation zum Projekt flöten geht und weil ich dann im inetpub/wwwroot wäre, was unschick wäre, wenn ich noch weitere Projekte darin speichere, die ggf. auch Bilder verlangen.

Wie macht ihr das?

10.10.2011 - 21:56 Uhr

verwendetes Datenbanksystem: MS SQL Server 2008

Ich erarbeite mir gerade anhand eines Nested Set SQL Tutorials eine DB und versuche nun das lese Statement in Linq umzuwandeln, aber das sieht nicht aus wie das handelsübliche SQL. Könnte mir jemand helfen?

SQL


SELECT n.name,
         COUNT(*)-1 AS level
    FROM tree AS n,
         tree AS p
   WHERE n.lft BETWEEN p.lft AND p.rgt
GROUP BY n.lft
ORDER BY n.lft;

Mein Ansatz:


var tree = from n in db.Categories
				           from p in db.Categories
				           where n.Lft >= p.Lft && n.Rgt <= p.Rgt
				           orderby n.Lft
				           select new
				                  	{
				                  		name = n.Name,
				                  		level = ""
				                  	};

Was mir also noch fehlt ist das "COUNT(*)-1 AS level" und das "GROUP BY n.lft" und ob der rest richtig ist, ist auch die Frage 😃

Danke im vorraus

04.10.2011 - 15:48 Uhr

Guter Einwand, vorsortieren scheint mir dann die richtige Wahl.

Hmm...tja und ob es überhaupt geht, wäre natürlich prima wenn das ein erfahrender SDK Entwickler beantworten könnte.

04.10.2011 - 12:08 Uhr

Hallo,

ich würde gerne mein erstes SDK Projekt entwickeln, aber es scheint ein wenig speziell zu sein.
Im Netz finde ich nur Beispiele für den Editor zu erweitern mit Farben und Rechtecken und weiß der Teufel.

Aber ich habe folgende Idee, die sich zwar einfach anhört, aber ohne zumindest Beispiele die in eine Ähnliche Richtung gehen schwer zu machen für einen Einsteiger.

Und zwar geht's darum, ich habe folgende Klassen:


class Test : ITest
{

}


class ModelA : Test
{

}


class ModelB
{
  public ITest TestEigenschaft { get; set; }
}

Und dann habe ich ein Programm mit einer X beliebigen Funktionen, nun tippe ich z.B. ein


var blub = new ModelB();
blub.TestEigenschaft = new 

So und jetzt möchte ich gerne eine Intellisense Box anzeigen, mit allen Klassen aus dem Projekt die das ITest Interface implementieren und nicht wie es Standard ist, alle.

Per Reflection raus finden welche Typen das Interface implentieren ist kein Problem, das kriege ich hin.
Aber der Teil mit der Intellisense Erweiterung, rauszufinden was vor den " = new" steht und das auch nur auszuführen wenn das eingegeben wurde, dass ist das Problem, weil es halt nur Beispiele mit Margins usw. gibt, aber nix mit Intellisense.

Könnt ihr mir ein wenig unter die Arme greifen?

Grüße

30.09.2011 - 08:00 Uhr

Hallo,

ich möchte mich am Wochenende gerne damit beschäftigen auf meinem Notebook auf dem ich auch entwickel, mit Virtual Box ein Windows Server 2008 System aufzusetzen und auf diesem dann eine TFS 2010 (Vollversion, keine Demo) Installation durchzuführen und dann würde ich gerne von meinem VS 2010 auf dem normalem System auf dem Notebook, auf den TFS in der Virtual Box connecten, ist das so überhaupt möglich, bevor ich jetzt Stunden investiere.

13.09.2011 - 11:53 Uhr

@Th69

Hey super, dank deinem Tip funktionierts!!!
Werde mir jetzt mal deinen Artikel zu Gemüte führen und schauen was das für eine Falle ist! 😃

Danke an alle!

13.09.2011 - 11:50 Uhr

@ dN!3L
Ja, ich weiß das sie AND verknüpft werden und genau das möchte ich auch.
Wo finde ich denn diesen "SQL Server Profiler"?

13.09.2011 - 11:30 Uhr

verwendetes Datenbanksystem: EF Code First & MS SQL 2005

Hi,

ich habe ein Problem mit dem Kombinieren von zwei Where Bedingungen und ich weiß nicht warum!
Ich habe eine IQueryable die mir als Basis dient und dann möchte ich zu dieser Where Bedingungen dynamisch hinzufügen.

Das komische ist, wenn ich nur eine Bedingung hinzufüge funktioniert das prima, aber sobald die zweite dazu kommt, bekomme ich kein Ergebnis mehr zurück.

Beide Bedingungen die ich kombinieren möchte, funktionieren für sich alleine!

Hier, was ich mache:


// Alle Filter aus dem Grid anwenden
				foreach (var loopFilter in gridParameter.Filter)
				{
					if (loopFilter.Key == "Betreff")
					{
						baseQuery = baseQuery.Where(a => a.Betreff.Contains(loopFilter.Value));
					}
					else if (loopFilter.Key == "GesendetAn")
					{
						baseQuery = baseQuery.Where(a => a.GesendetAnUsername.Contains(loopFilter.Value));
					}
					else if (loopFilter.Key == "Kundenname")
					{
						baseQuery = baseQuery.Where(a => a.Kunde.Name.Contains(loopFilter.Value));
					}
					else if (loopFilter.Key == "Status")
					{
						var val = Convert.ToBoolean(loopFilter.Value);
						baseQuery = baseQuery.Where(a => a.IstErledigt == val);
					}					
				}

baseQuery ist die IQueryable.

Habt ihr irgendwelche Ideen?

Grüße

27.08.2011 - 13:25 Uhr

Hi,

Ich habe wieder eine Idee und wieder muss ich erst mal fragen ob das mit C# 4 Boardmitteln überhaupt möglich ist.

Sagen wir ich habe eine Klasse aus einer externen DLL die nicht von mir ist (Um klar zu machen, ich habe keine Möglichkeit die Klasse zu verändern).

Diese sieht so aus:


public class Test
{
    public String HalloWelt()
    {
        File.WriteAllText("...", "Hallo Welt");
    }
}

So, was ich jetzt gerne tun möchte, so fern möglich, ich würde gerne per Reflection einen BeforeExecute und einen AfterExecute Event hinzufügen.

Also sprich, sagen wir, ich habe eine Zweite Klasse


public class Test2
{
    public void Before()
    {
        Console.WriteLine("Before");
    }

    public void After()
    {
        Console.WriteLine("After");
    }
}

Und jetzt möchte ich jedes Mal bevor Test.HalloWelt() ausgeführt wird Test2.Before() ausführen und danach eben Test2.After().

Und diese Events müssten auch noch per Reflection gebunden werden, weil ich das ganze zur Laufzeit mache.

Ich denke nicht das das möglich ist, aber ich dachte ich frage mal 😃

Grüße und schönes Wochenende

23.08.2011 - 13:49 Uhr

Oh man, ich habe mal wieder ein wahnwitziges Problem!

Ich habe eine Seite, die einen ResultFilter, den ich so auf den Response anwende:


internal class ResultFilters : IResultFilter
{
    public void OnResultExecuted(ResultExecutedContext filterContext)
    {			
	var response = filterContext.HttpContext.Response;
			
	if (response.Filter != null)
	{
             response.Filter = new DynamicScriptStream(response.Filter);
        }
    }
}

und der Stream sieht so aus:


internal class DynamicScriptStream : Stream
	{
#region Abstract Stream methods
		
		private Stream _shrink;


		public DynamicScriptStream(Stream shrink)
		{
			_shrink = shrink;
		}


		public override bool CanRead { get { return true; } }
		public override bool CanSeek { get { return true; } }
		public override bool CanWrite { get { return true; } }
		public override void Flush() { _shrink.Flush(); }
		public override long Length { get { return 0; } }
		public override long Position { get; set; }


		public override int Read(byte[] buffer, int offset, int count)
		{
			return _shrink.Read(buffer, offset, count);
		}


		public override long Seek(long offset, SeekOrigin origin)
		{
			return _shrink.Seek(offset, origin);
		}


		public override void SetLength(long value)
		{
			_shrink.SetLength(value);
		}


		public override void Close()
		{
			_shrink.Close();
		}

#endregion
		

		public override void Write(byte[] buffer, int offset, int count)
		{
			// Load the HTML Code out of the response
			String html = System.Text.Encoding.UTF8.GetString(buffer, offset, count);			
			String scriptContent = String.Empty;

			
			var generatedCode = ger.GetGeneratedJavaScript();			
			if (!String.IsNullOrEmpty(generatedCode))
			{
				File.AppendAllText("testdebug.txt", buffer.Length + "|" + offset + "|" + count + "\n\n\n");				
				var lastBody = html.LastIndexOf("</body>");				


				scriptContent = "<script type=\"text/javascript\">\n";
				scriptContent += "$(document).ready(function () {\n";

				scriptContent += generatedCode;

				scriptContent += "});\n";
				scriptContent += "</script>\n";


				if (lastBody > -1)
				{					
					html = html.Insert(lastBody, "\n\n" + scriptContent);
				}
				else
				{					
					html += "\n\n" + scriptContent;
				}
			}


			// Send output  
			buffer = System.Text.Encoding.UTF8.GetBytes(html);
			_shrink.Write(buffer, 0, buffer.Length);			
		}		
	}

Funktioniert lokal (Mit VS Server) einwandfrei!
Dann habe ich das ganz auf unseren Server geschoben mit echtem IIS, laufen lassen und dann wurde die Seite nicht korrekt angezeigt.
Ich also debuggt und debuggt und nach langem hin und her habe ich es nun eingegrenzt.
Wie ihr oben seht, habe ich noch eine Debuggingzeile drin.
Und zwar lokal führt er diesen Filter einmal aus und die Bufferlänge beträgt 14476 und alles ist gut.
Auf dem Server führt er den Filter 2x aus, einmal mit einem Buffer von 13317 und einmal mit einem Buffer von 1257, WIESO?????????

Ich will den Filter natürlich nur einmal ausführen, wenn DER KOMPLETTE Response geladen ist. So gibts natürlich fehler, weil er einen unfertigen Response bearbeitet.

Irgendwelche Ideen?

Liebe Grüße

19.08.2011 - 15:22 Uhr

Hallo C#ler,

vorweg muss ich sagen, bisher habe ich noch keine Ahnung von VS Plugin Entwicklung und ich weiß nur was T4 Templates sind, habe sie aber noch nicht genutzt.

Jetzt möchte ich gerne etwas tun, wofür diese Dinge bestimmt gebraucht werden.
Ich würde gerne von euch wissen ob es überhaupt möglich ist was ich vorhabe und toll wäre natürlich ein Hinweis wo genau ich suchen soll, oder was ich mir genau anschauen soll.
Aber hilfreich wäre auch nur die Aussage möglich, oder nicht bevor ich mir jetzt wissen ohne Ende aneigne und dann gehts überhaupt nicht. 😃

Also, ich würde gerne im Projektexplorer -> Rechter Mausklick -> "Neues Element..." Dialog einen neuen Dateityp in der Internetrubrik haben mit der Endung ".ibu", dann nenne ich Datei z.B. "Test1_xyz.ibu" und wenn ich dann "OK" klicke, soll in dem Ordner den ich mit rechts angeklickt habe eine "Test1_xyz.xml" Datei angelegt werden mit dem Inhalt.


<Main>
    <Test1>
        <xyz></xyz>
    </Test1>
</Main>

Also, die ".ibu" Datei soll quasie nie angelegt werden, nur irgendwie muss ich irgend einen Generator bei einer ".ibu" Datei anwerfen und ihm den Dateinamen übergeben und der kann dann mit diesen Daten arbeiten (Split auf "_" usw.) und tun was ihm beliebt.

Und bitte nicht über Sinn und Unsinn diskutieren, dass ist nur ein Beispiel.

Grüße

12.08.2011 - 16:30 Uhr

Also, ich weiß ja nicht wie umfangreich deine Web 2.0 Projekte mit jQuery bisher so waren, aber ich habe schon zig mal im JavaScript mit C# zur Hilfe genommen, sei es um Model Werte einem jQuery.post als Parameter zu übergeben, Code je nach ViewBag Wert auszuführen, oder oder oder.

Und, eine kleine JavaScript View mit 50-100 Zeilen zu rendern, dauert wieviel Millisekunden?

Also in Zeiten, wo Bilder und Videos mit mehreren MB genutzt werden als gäbe es kein morgen, halte ich das jetzt für ein wenig übertrieben, ich will ja keinen neuen HTTP Request dafür machen, sondern lokal die View von der Platte dazu rendern.

Aber gut, jedem seine Meinung

12.08.2011 - 14:23 Uhr

Hi,

ich habe eine Frage, ich schreibe gerade an einer eigenen MVC ViewEngine und ich würde gerne ein Feature einbauen, bei dem mir noch der richtige Ansatz fehlt und da wollte ich mal in die Runde fragen.

Was ich machen möchte ist, wenn ich z.B. Site/Index aufrufe, was ja die View "/Views/Site/Index.cshtml" lädt, das automatisch unter dem geladenen Content der View, der Inhalt der View "/Views/Site/Index.js.cshtml" geladen wird.

Das möchte ich machen, weil ich einfach an meinen Projekten merke, mit Ajax und dem ganzen schönen Web 2.0 Sachen, ist der JavaScript Code Anteil, enorm und ich möchte ihn gerne auslagern um meine Views ein wenig schlanker zu halten!

Mehrere Sachen würde ich dabei gerne beachten:

  • Der automatisch geladenen View, soll das Model der "manuell" geladenen View übergeben werden, so sie denn eins hat.
  • Es soll, tatsächlich auf View Ebene passieren, nicht auf Action Ebene.
  • Ich möchte gerne weiterhin, einfach "return View()" benutzen.

Liebe Grüße

12.08.2011 - 08:32 Uhr

Ich ärgere mich, es hat mit was anderem zu tun!!

Es tut mir so leid, dass ich die Hühner scheu gemacht habe! 😭

Ich hatte kurz bevor ich nach Hause gegangen bin, noch eine Sache eingebaut, die ich auch genau einmal getestet habe und ein Request funktioniert ja immer, erst beim zweiten wo er den Cache ansteuert knallts! 😭

11.08.2011 - 19:17 Uhr

Wie gesagt, ich habe nur die CacheDependency auf die Datei raus genommen und schon funktionierts, nehme ich sie rein, funktionierts nichts mehr und ich packe die Datei nicht an mit der ich teste.

Ich teste auf beiden Systemen mit dem VS internen Webserver!
Ich habe auf beiden Systemen die selben VS Extensions installiert.

Gut, auf der Arbeit ist es ein Windows XP zu Hause ein Windows 7, aber was ist wahrscheinlicher das Windows die Dateien irgendwie anders behandelt, oder die Festplatte, von der ich weiß das sie Dateien intern verschlüsselt und zippt und sie nur normal anzeigt!

Ich glaube einfach das die CacheDependency Klasse damit nicht klar kommt weil Microsoft SSDs die Dateien intern so krass manipulieren und dem Benutzer nur vorgaukeln sie würden normal dort liegen, statt eben für diese SSD optimiert nicht auf der Rechnung hatte, weil sie ja auch viel neuer sind als das .NET Framework!

Ich habe übrigens eine OCX Vertex 3, also wirklich das neuste vom neusten!

11.08.2011 - 18:32 Uhr

Hi,

ich wollte euch an meinem Wissen teilhaben das ich gerade durch Stundenlanges debuggen gefunden habe!

Ich habe auf der Arbeit etwas programmiert was den Cache benutzt mit einer CacheDependency auf eine Datei, hat alles funktioniert, Code nach Hause geschickt, laufen lassen, der Cache war immer leer!!

Ich bin fast wahnsinnig geworden, habe mein halbes Projekt debuggt, habe an meinem Verstand gezweifelt und dann kam mir die Idee, OK, ich habe eine SSD und habe was davon gelesen das der Sandforce Controller die Dateien automatisch verschlüsselt, nehme mal die CacheDependency raus und siehe da es funktioniert!!

Also, Cachen mit Abhängikeit auf eine Datei auf eine SSD mit Sandforce Controller nicht möglich!

Liebe Grüße

10.08.2011 - 12:09 Uhr

Nein, das sieht erst mal sehr gut aus, werds gleich mal testen, aber schon mal danke!

10.08.2011 - 11:13 Uhr

Das kann ich ganz einfach erklären, das Interface (Und damit natürlich auch jeder Typ der dieses Implementiert) hat zwei Methode GetMinVersion() und GetMaxVersion().

Und ich muss jetzt jeweils für jeden Typ den größten gemeinsamen Nenner finden.

Also wenn Typ a 3x drin ist:

a(minVersion = "1.3.0"; maxVersion = "1.5.0")
a(minVersion = "1.3.0"; maxVersion = "1.4.0")
a(minVersion = "1.4.0"; maxVersion = "1.6.0")

wäre der gemeinsame Nenner "1.4.0", aber diesen muss ich eben pro Typ rausfinden und nicht global für alle Typen.

Und um diesen zu finden muss ich alle Einträge zu diesem Typen mit einander vergleichen.

10.08.2011 - 10:44 Uhr

Das geht aus mehreren Gründen nicht, ich kenne A z.B. überhaupt nicht, ich kenne nicht die Typen die ITest implementieren, dass muss schon alles dynamisch sein.

10.08.2011 - 09:51 Uhr

Hallo,

ich habe eine kleine Frage.
Ich habe eine Liste vom Typ List<ITest> und zwei Typen (a und b) die dieses Interface implementieren.

Nun mache ich:


List<ITest> liste = new List<ITest>();

liste.Add(new a());
liste.Add(new a());
liste.Add(new b());
liste.Add(new a());
liste.Add(new b());
liste.Add(new b());

Es können aber unendlich viele Typen werden die ich nicht kenne die in die Liste gespeichern werden.

Nun möchte ich zwei Schritte machen.

  1. Ich möchte gerne die unterschiedlichen Typen in der Liste finden.
    In dem Beispiel a und b.

  2. Möchte ich gerne für jeden Typen aus Schritt 1 durch die Liste gehen und dann nur die Einträge des übergebenen Typen berücksichtigen.
    Also sprachlich ausgedrückt.

Ich habe mir jetzt im ersten Schritt die unterschiedlichen Typen geholt und jetzt rufe ich CompareEntries(List<ITest> liste, Type type) mit der vollen Liste und erst a und dann b als type auf.
Natürlich dynamisch.

Kann mir jemand dabei helfen?

04.08.2011 - 10:31 Uhr

Hallo,

ich muss jetzt etwas mit jQuery programmieren und ich weiß nicht mal wo ich anfangen soll 😭
Und ich hoffe das ihr mir weiter helfen könnt, ich bin für alles dankbar!

Ich muss eine Art Stempelwerkzeug mit jQuery und ASP.NET MVC basteln.
Ich kenne jQuery und dessen PlugIns eigentlich ganz gut, aber nur so die normalen Sachen, Events, Selectoren und Ajax, aber das jetzt ist etwas ganz anderes.

Die Situation ist folgende, ich habe eine Seite mit links einem Bild mit den Maßen 250px mal 250px und rechts eine leere Fläche mit den selben Maßen, jetzt muss ich verschiedene Dinge machen, wie gesagt, auch für jede Teillösung oder Hilfestellung von euch bin ich dankbar!

  1. Über das Bild muss ich ein Raster legen, mit einer 1px schwarzen Linie, wobei ein Rasterkästchen 50 mal 50px hat. Also habe ich dann 5 Kästchen vertikal und horizontal.

  2. Wenn ich nun mit der Maus über sollch ein Kästchen gehe, soll der 1px Border nur um dieses eine Kästchen rot statt schwarz werden.

  3. Wenn ich jetzt ein Kästchen anklicke, soll quasie nur der 50x50 Teilabschnitt des kompletten Bildes irgendwie in einer Art Zwichenablage liegen.

  4. Und dann möchte ich rechts in der freien Fläche, die auch das selbe Rastergitter hat (50x50) auf die verschiedenen Kästchen klicken können und dann wird dort immer der Teilabschnitt des Bildes aus der Zwischenablage reinkopiert, bis ich dann ein anderes wähle und dann mit diesem "stempeln" kann.

Das ist mal etwas extravagantes, oder?! 😃
Ich hoffe jemand von euch kann mir helfen.

Liebe Grüße

04.07.2011 - 22:57 Uhr

Dankeschön, werde ich mir mal zu Gemüte führen.

Gute Nacht an alle

04.07.2011 - 22:50 Uhr
return this as TModel;

Das funktioniert.

Mein versuch this zu casten mit (TModel)this hat nicht funktioniert.

04.07.2011 - 22:47 Uhr

Das sagt mir leider nichts, ich benutze dieses "as" nicht, ich weiß nur das es das gibt 😃

04.07.2011 - 22:32 Uhr

Ich werde nicht mehr, das funktioniert!!!
Danke!!

Aber was ist denn der Unterschied zwischen:


return (TModel)this; // Was ich versucht habe, und
return this as TModel;

???

04.07.2011 - 22:03 Uhr

Danke dir, aber diese Lösung ist leider für meinen Fall nicht praktikabel, das ist zu viel Tiparbeit und wird dann auch zu unübersichtlich, aber trotzdem danke!

04.07.2011 - 21:38 Uhr

Kaum ist das eine Problem gelöst oder besser umgangen, tritt auch schon das nächste auf.
Ich versuche das Problem wieder möglichst kurz zu erklären.

Ich versuche ein Fluent Interface für Html Tags zu basteln.

Mein Grundgedanke und erster Versuch war in etwa dieser:


public interface IHtmlTag
{
  IHtmlTag Id(String);


  IHtmlTag Class(String);
}


public class HtmlTag : IHtmlTag
{
  public IHtmlTag Id(String)
  {
    ...
    return this;
  }


  public IHtmlTag Class(String)
  {
    ...
    return this;
  }
}


public class aTag : HtmlTag
{
  public IHtmlTag Href(String)
  {
    ...
    return this;
  }
}


public class divTag : HtmlTag
{
  public IHtmlTag Float(String)
  {
    ...
    return this;
  }
}

So, das hat soweit auch ganz gut funktioniert, bis mir auffiel, das ich bei einem Link dann die aTag Funktionen verliere sobald ich eine HtmlTag Funktion wie z.B. "Id" aufrufe, da ich ja ein IHtmlTag zurückgebe, was zur Laufzeit natürlich ein aTag ist, aber das versteht er so nicht.

Gut dachte ich, versuche ich es etwas anders:


public interface IHtmlTag<TModel>
{
  TModel Id(String);


  TModel Class(String);
}


public class HtmlTag<TModel> : IHtmlTag<TModel>
{
  public TModel Id(String)
  {
    ...
    return this;
  }


  public TModel Class(String)
  {
    ...
    return this;
  }
}


public class aTag : HtmlTag<aTag>
{
  public aTag Href(String)
  {
    ...
    return this;
  }
}


public class divTag : HtmlTag<divTag>
{
  public divTag Float(String)
  {
    ...
    return this;
  }
}

ich dachte das wäre schon ganz schön klever, aber das denkt wohl der Compiler nicht, weil das kann ich nicht kompelieren, die Fehlermeldung ist das sich "this" nicht in TModel konvertieren lässt obwohl das zur Laufzeit genau das wäre, aber eben nicht zur Compilerzeit. 😭

Andere Ideen wie ich mein Vorhaben umsetzen kann?

Liebe Grüße

PS: Am Ende soll es halt so aussehen:


var blub = new aTag().Id("").Href("");

04.07.2011 - 21:21 Uhr

Sorry, langer Tag heute! 😭

Danke für eure Hilfe, habs nach euren Bedenken anders gelöst!

Liebe Grüße

03.07.2011 - 19:53 Uhr

Hi,

ich habe eine kleine Frage zu später Stunde.

Ich habe eine Methode mit folgender Deklaration:


public void Do(Action<abc> config);

Jetzt ist es ja, so, ich kann zwei verschiedene Arten von Notation da rein schreiben.
Einmal


Do(test => test.Blub("Test").Blub2("asd"));

Und


Do(test => 
{
  test.Blub("asd");

  if(true)
  {
    // Irgendwas
  }
});

Jetzt, meine Frage, kann ich in der Funktion "Do" irgendwie rausfinden welche Notation benutzt wurde, also ob die Fluent, oder die mit den "{" Zeichen?

Liebe Grüße

03.06.2011 - 12:26 Uhr

Hi,

eine Frage an die Community bezüglich Routings.

Ist es möglich (auch vielleicht wen man eine eigene Routeklasse schreibt) mit einer URL eine Seite eines ganz anderen Projektes anzuzeigen?

Also sagen wir, ich habe ein Testprojekt unter:


http://www.testprojekt.de

Eine normale Route wirde jetzt lauten:


http://www.testprojekt.de/Controller/View
z.B.
http://www.testprojekt.de/Account/Login

Jetzt würde ich aber gerne, folgende URL aufrufen:


http://www.testprojekt.de/Config
Die URL
http://www.testprojekt.de/Config/Site/Index, müsste dann natürlich den Controller Site im Configprojekt ansprechen.

und dann eine Seite anzeigen die unter:


http://www.configprojekt.de/

liegt. Mit der Querystring Info "Projekt=Testprojekt"

Ich möchte das machen, damit ich nur einmal das Configprojekt habe, aber damit 1-n Projekte konfigurieren kann.
Deshalb keine Area im Testprojekt selber!

Aber für Gegenvorschläge bin ich auch offen.

Liebe Grüße

01.06.2011 - 19:56 Uhr

Tja, müsste man mal wissen, was so eine Instanz(DB Model) an RAM verbraucht...
Dann könnte man ja rechnen, eine Klasse 10 KB x 2000.

Aber sowas kann man wahrscheinlich nur mit irgendwelchen teuren Tools rausfinden.

01.06.2011 - 19:45 Uhr

Also, du meinst von Fall zu Fall entscheiden?!

Ist wahrscheinlich das beste, oder...

01.06.2011 - 19:40 Uhr

verwendetes Datenbanksystem: MS SQL 2008

Hi,

ich habe eine Performance Frage vor der ich jetzt stehe und die ich mir selbst leider nicht beantworten kann.

Ich habe ein Webprojekt mit einem GridControl und ich stehe jetzt vor der Frage welcher Weg der Datenbeschaffung der richtige ist.

Das Grid bietet Paging mit z.B. 20 Einträgen pro Seite.
Jetzt kann ich technisch beides machen, ich kann einmal alle Daten holen, diese dann lokal cachen und alles was danach passiert, wie im Grid filtern, mittels Paging blättern und sortieren auf den lokalen Daten machen, oder ich kann mir immer nur die 20 Einträge holen und mit diesen arbeiten und bei jeder Aktion die Daten neu holen, aber eben immer nur 20 Einträge, statt vielleicht 2000.

Das eine sind halt viele DB Abfragen, aber dafür lächerliche.
Das andere ist viel RAM Verbrauch und einmal eine sehr lange Abfrage, aber dafür nur eine.

Ratschläge?

30.05.2011 - 13:16 Uhr

Dein Link hat mir schon geholfen, danke dir!

30.05.2011 - 13:06 Uhr

Wie ich bereits sagte, das mit den Scripten ist nur ein Beispiel!
Weil das gerade ein Praxisnahes Beispiel war:


public class xyViewPage<TModel> : ViewPage<TModel>
{
  public List<String> Scrips { get; set; }
}

View "_Master":



<html>
<head>
  @foreach(var Script in Scrips) {
       <script ...>
  }
</head>
....
@RenderBody()
....

View Login:


...
// Dieser Zugriff soll jetzt nicht die Property Scripts von der Login xyViewPage Instans füllen, sondern irgendwie von der _Master Instanz
@this.Scripts.Add("asdasd")
...

Ich hoffe das machts ein wenig klarer

30.05.2011 - 12:46 Uhr

Hi,

ich könnte von einem erfahrenden MVC Entwickler hilfe brauchen.
ich arbeite gerade an einer eigenen kleinen ViewEngine.

Jetzt habe ich den Wunsch folgendes zu tun.

Ich habe meine eigene ViewPage Klasse "xyViewPage", diese soll eine Eigenschaft Scripts haben.
Dann möchte ich gerne irgendwie in der MasterView Scripts im Header ausgeben.

Aber es sollen halt auch Scripts in den Views und PartialViews hinzugefügt werden, aber die müssen irgendwie an die MasterViewPage.Scripts Eigenschaft durchgeschleust werden.

Eine Idee wie ich das hinbekommen kann?

PS: Das ist nur ein Beispiel, über den Sinn kann sich diskutieren lassen, mir gehts primär um das durchschleusen von z.B. der ViewPage "Account/Login" zur ViewPage "_Member", also als würde ich die Eigenschaft der MasterView per "ref" an die unteren Views geben und diese die nutzen.

Oh man, ich hoffe ich habs einigermaßen erklärt....

Liebe Grüße