Archive of articles classified as' "Programmering"

Back home

Resharper & Entity Framework Generated Code

18/05/2011

Been looking for a way to get Resharper to ignore the code that is generated by Entity Framework for a while. Sure, I can ignore the entire project, but since we also had some repo/Unit Of Work implementations in the same project, that’s really not an option.

The final solution was to edit the code generating T4 (.tt) templates of Entity Framework to wrap the code in a custom region, i.e. ”EF Generated code”.

Then tell Resharper to simply skip checking anything that is within region ”EF Generated Code” from ReSharper -> Options -> Generated Code

Done!

No Comments

MVC3 Ajax partial view validation

5/05/2011

Ran into a wall of trouble after getting Ajax to work properly in my previous post. Turns out that validation rules are not applied to partial views loaded with Ajax (Even when using the provided Ajax.ActionLink helper).

Thanks to this excellent blogpost http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/ i managed to work it out. But not until after bashing my head against the wall until numb.

The main problem was not so much the actual validation scripts, it was pretty clear to me that the validation rules would have to be rebuilt after injecting new objects into the DOM, but the fact that MVC refused to acually render the data-val / data-val-required properties for the elements that needed validating.

These properties are usually rendered by Html.EditorFor / ValidationMessageFor when used as in the example above.

This is how it should look:

<input class="text-box single-line" 
       data-val="true" 
       data-val-required="This field is required!" 
       id="Property" 
       name="Property" 
       type="text" 
       value=""
/>

But when including a partial view through Ajax inside this outer form, the ability to use BeginForm inside that partial view is lost due to the fact that we can not have nested forms. And without BeginForm, no data-val properties 🙁

The key to getting the partial view to render the properties was to wrap the contents like the following code snippet:

@using(new MvcForm(ViewContext))
{
    <div class="editor-label">
        @Html.LabelFor(model => model.Property)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Property)
        @Html.ValidationMessageFor(model => model.Property)
    </div>

}    

And then to get the validation going, call xhalent’s brilliant js-function after appending the results of the Ajax request to the DOM.

$('#ajaxstuff').ajaxLink({              
  data: {},
  success: function (data) {             
    $('#ajaxdiv').append(data);
    $.validator.unobtrusive.parseDynamicContent('form');
  }
});

1 Comment

Simple and painless Ajax in MVC3

27/04/2011

Even though Microsoft really came through with MVC3 and added a lot of sweetness, I still find myself reluctant to use the provided Ajax-functionality.

Here’s why:

This approach is nice and simple, yes. But what if I don’t like having global javascript functions all over the place to handle the results of the action. It kind of pains me to see that I can use ”unobtrusive” validation functionality in MVC3 but not unobtrusive Ajax handling.

This is solved by implementing the ”ajaxification” of a normal Html.ActionLink in a separate javascript,
such as proposed here http://stackoverflow.com/questions/4878127/mvc3-ajax-actionlink.

I needed a more reusable way of doing this, but portable enough to be painlessly lifted to other projects and easy to use for other developers in the project. So i slapped together this jQuery plugin…

Using it is quite straightforward, or at least it seems to me at the time of writing this.

First, we create the controller action that we want to call with the Ajax link:

This action returns a view, so a view will have to be created as well. A simple plain text partial view will do fine. Be sure not to load any layout for this though. The action could have returned JSON as well,
as both cases can be handled by the jQuery plugin.

With a controller action and a view in place, we create the ActionLink in the view where we need the Ajax functionality:

There we go!, now we can declare all our events and handlers well outside the view layout as demonstrated in the following gist:

No Comments

iPhoneOS : Arkivera egna objekt

12/03/2010

Låt oss anta att vi vill designa en applikation som innehåller ett antal egendefinierade objekt.

Dessa behöver vi spara på något sätt, t.ex. när användaren stänger av applikationen eller om användaren skulle få ett telefonsamtal under tiden som applikationen körs.  Utifall att detta händer vill vi att applikationens variabler ska bevaras, och att även våra egendefinierade objekt ska sparas på samma sätt som andra inställningar sparas.

Att spara användardata är en återkommande punkt i de flesta iPhone-applikationer, och jag brukar använda NSUserDefaults för att på ett enkelt sätt spara och hämta data.

Data sparas på följande sätt


NSInteger intToSave = 23;

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

[preferences setInteger:intToSave forKey:@"keyToSavedInt"];

Och hämtas pÃ¥ följande sätt…


NSInteger intToRetrieve;

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

intToRetrieve = [preferences integerForKey:@"keyToSavedInt"];

I min mening det absolut smidigaste sättet att hantera användardata pÃ¥… det vill säga sÃ¥länge som man bara sparar Obj-C datatyper. Men om man däremot vill spara en array av egendefinierade typer, ja dÃ¥ blir det lite mindre smidigt.

Extra smidigt blir det om det dessutom är en hierarki av objekt.

Säg att vi har en applikation som ska hålla koll på lastbilar och deras last.

Låt oss använda en NSMutableArray för att hålla koll på alla lastbilar, och sedan definiera en klass för lastbilar, och en klass för last.

En näst intill pinsamt förenklad implementation av klassen Lastbil följer här.

Lastbil.h

#import <Foundation/Foundation.h>
#import "Last.h"

@interface Lastbil : NSObject {
	Last *last;
}

@property(nonatomic,retain) Last *last;

@end

Lastbil.m

#import "Lastbil.h"

@implementation Lastbil
     @synthesize last

-(id)init
{
    if (self = [super init])
    {
     //Init
		}

    return self;
}

- (void)dealloc
{
    [self.last release];
    [super dealloc];
}

@end

Och sÃ¥ lasten…

Last.h

#import <Foundation/Foundation.h>

@interface Last : NSObject {
	NSString *beskrivning;
}

@property(nonatomic,copy) NSString *beskrivning;

@end

Last.m

#import "Last.h"

@implementation Last

@synthesize beskrivning;

- (id)initWithBeskrivning: (NSString*)b
{
	self.beskrivning = b;
	return self;
}

- (void)dealloc
{
    [self.beskrivning release];
    [super dealloc];
}

@end

Ja nåt i den stilen. Blind kod och en knapphändig implementation, precis som det ska va.

Då är själva objekten deklarerade, det som återstår är att.. ja.. använda dem.

NSMutableArray *lastbilar = [[NSMutableArray alloc] init];

Lastbil *lastbil1 = [[Lastbil alloc] init];
Lastbil *lastbil2 = [[Lastbil alloc] init];

lastbil1.last = [[Last alloc] initWithBeskrivning:@"Fisk"];
lastbil2.last = [[Last alloc] initWithBeskrivning:@"Kött"];

[lastbilar addObject:lastbil1];
[lastbilar addObject:lastbil2];

[lastbilar release];

Då har vi en datastruktur som innehåller två lastbilar, den ena med fisk i lasten och den andra med gott, mört kött i lasten.

Om vi nu vill spara denna datastruktur till NSUserDefaults så skulle vi kunna göra det genom att först arkivera den till ett NSData-objekt med NSKeyedArchiver..

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

MEN detta är inte rumba, och kommer inte att fungera då våra egendefinierade objekt (Lastbil, Last) inte implementerar NSCoding protokollet. Alla objekt måste, om de ska kunna arkiveras, implementera metoder för hur de ska arkiveras och hur de ska avarkiveras. Enligt NSCoding måste alltså våra objekt implementera följande metoder.

- (void)encodeWithCoder:(NSCoder *)encoder
- (id)initWithCoder:(NSCoder *)decoder

Så låt oss implementera dessa metoder först i Lastbil.m. Det vi vill göra är att specifiera vilka av objektets egenskaper som ska arkiveras, och under vilka nycklas värdena ska arkiveras, detsamma för avarkivering.

- (void)encodeWithCoder:(NSCoder *)coder;
{
	[coder encodeObject:self.last forKey:@"last"];

}

- (id)initWithCoder:(NSCoder *)coder;
{
     if (self = [super init])
    {
		self.last = [coder decodeObjectForKey:@"last"];

	}
    return self;
}

…och sedan i Last.m

- (void)encodeWithCoder:(NSCoder *)coder;
{
	[coder encodeObject:self.beskrivning forKey:@"beskrivning"];

}

- (id)initWithCoder:(NSCoder *)coder;
{
     if (self = [super init])
    {
		self.beskrivning = [coder decodeObjectForKey:@"beskrivning"];

	}
    return self;
}

That’s pretty much it.

Nu går det bra att arkivera hela objekthierarkin, eftersom alla objekt i hierarkin kan arkiveras (NSCoder).

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

Och ett objekt av typen NSData går givetvis att spara till NSUserDefaults precis som motsvarande enkla datatyper.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

[preferences setObject:lastbilData forKey:@"Lastbilar"];

Och går att läsa tillbaka, med minimal ansträngning.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSData *lastbilData = [preferences objectForKey:@"Lastbilar"];

	if (lastbilData != nil)
	{
		NSArray *gamlaLastbilar = [NSKeyedUnarchiver unarchiveObjectWithData:lastbilData];

			if (gamlaLastbilar != nil)
			{
				//Presentera information
			}
	}

Och så gör man alltså för att arkivera sina egna objekt!

Andra bloggar om: , , ,

1 Comment

iPhoneOS : Framerate independence

8/03/2010

Närsom man animerar ett objekt på egen hand (OpenGL) så måste man vara beredd på att saker och ting kan hända i resten av operativsystemet under tiden som animeringen pågår. Detta leder då till osmakliga hack i de annars så vackra rörelsemönstren.

För att lösa detta gör jag två saker.

1. Sätter upp en ”target” framerate som är referens vid alla beräkningar.
2. Räknar ut skillnaden mellan faktisk framerate och target-framerate och multiplicerar alla rörelser på skärmen med detta värde.

NÃ¥got i denhär stilen…

- (void)render {

NSDate *startDate = [[NSDate date] retain];

float wantedTime = 0.025; //Target framerate = 40 fps, dvs 1/40

/*
Rendering sker här, vi använder mätvärde från föregående frame för rörelsekompensation
*/

self.speedFactor = [[NSDate date] timeIntervalSinceDate:startDate] / wantedTime;

}

Alla rörelser multipliceras sedan med speedFactor, såsom


obj.Ypos = (sin(obj.direction*(M_PI/180))*BSPEED) * self.speedFactor;

Inga fler hack när iPhoneOS kollar din mail, uppdaterar din plats eller skickar hemliga data till Steve Jobs medan du spelar!

Andra bloggar om: , , , ,

No Comments

SDK Beta 2 ute.

28/03/2008

sdk Beta 2 ute.Apple lanserar nu iPhone SDK Beta 2, som bland annat innehåller en uppgraderad Interface Builder där man kan skapa interface till iPhone precis som man kan till vanliga OS X Program, samt en näve ny exempelkod. Riktigt gött.

Nästan lika gött som att man, trots att Apple förnekar detta, fortvarande kan installera och köra SDK:t pÃ¥ en PPC Mac 🙂

Mer info på ADC och en liten changelog här(kräver konto på ADC)

Andra bloggar om: , , ,

No Comments

Ruby <3

27/02/2007

Ruby

I samband med att jag behövde utveckla en client/server-applikation med klientsidan för MacOS så snubblade jag över programmeringsspråket Ruby. Och vad kan jag säga?
Read the rest of this article »

2 Comments

JavaScript Validator

17/05/2006

codezorJa då var det dags igen! Steffe vs. JavaScript del 2, och den här gången handlar det om datatyp-validering med en liten twist. Jag behövde ett script som inte bara kunde validera om ett formobjekt var ifyllt eller inte, utan även vilken form av data som fanns i den, många olika typer av data dessutom! Och som om inte det hade räckt skulle skriptet även kunna hantera dynamiskt generade form-objekt av varierande datatyper.

Fanns en hel del olika skript och funktionsbibliotek runt omkring på nätet, men det föll på att så gott som alla dessa inte kunde hantera svenska datumformat av formen YYYY-MM-DD. Orkar man då som jag inte modifiera någons annan kod så finns det inte mycket kvar att göra än att skriva sitt eget funktionsbibliotek! Och eftersom jag är så snäll så tänkte jag dela med mig av detta.

Version 1.0 av mitt fulkodade(tm) funktionsbibliotek kan validera följande datatyper: Heltal, Flyttal, Valuta och Datum. Och det är förhÃ¥llandevis enkelt att modifiera. Datumfunktionen bygger pÃ¥ en spännande idé jag fick om hur man skulle kunna göra en datumvaliderings-funktion som var förhÃ¥llandevis flexibel för datumtyper, den fungerar sÃ¥ att man matar den med en mall för vilket datumformat som ska valideras. Flyttal och valuta ersätter ”,” med ”.” eftersom jag behövde proppa in datan i en databas, men om man inte vill ha detta kan man ju alltid kommentera av lite kod.

Jaja, vill man veta mer kan man alltid läsa igenom källkoden och testa loss lite. Lägger upp en liten demonstration här <--. Källkoden för validate.js finns här.

No Comments

JavaScript: Ersätt sidinnehåll utan att ladda om sidan

13/03/2006

Jag och JavaScript har inte alltid varit bästa vänner, men på senare dagar har vi blivit tvungna att komma överens varesig vi vill eller inte. Senaste gången vi grälade var jag i behov av att kunna uppdatera information på en sida utan att posta om den, och här är den fruktansvärt enkla lösningen för alla intresserade.
Read the rest of this article »

No Comments