Wednesday, May 22, 2013

MVC Razor Inline Syntax

(Boş bir zaman bulduğumda Türkçe'ye çevirmek üzere acil ihtiyaca binaen orijinal haliyle yayınlanmıştır. İçerik kopyalama nedeni link ölme durumuna karşı tedbirdir ;)

KAYNAK


Inline Razor Syntax Overview


With the launch of WebMatrix, and the announcement of the new Razor View Engine for the next version of ASP.NET MVC, here's a quick guide to Razor syntax.

All code blocks must appear within @{ ... } brackets. As soon as you type @, you are assumed to have started writing code. Everything that follows is assumed to be code, unless you tell Razor otherwise:
@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){

}
}
If you want to render the variable number within the loop above, you have to prefix it with an @ sign:
@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
@number
}
}
If you want to render the result of a single line expression, you use the @( ... ) syntax:
@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
@(number * 10)
}
}
If you want to mix inline variables with items to be rendered literally (verbatim strings) within a code block, there are three ways to tell Razor where the code pauses and the literal text or markup begins. The first, if the additional item is text only, is to prefix the text with @: before the first instance of text in the line:
@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
@(number * 10)@: 
}
}
You only need to use the @: operator once per line:
@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
@(number * 10)@: * 10 = @(number * 10)
}
}
Razor also looks for html tags. If it sees one, it jumps out of code and will only jump back into code when it sees a matching closing tag:
@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
<span>@(number * 10)&nbsp;</span>
}
}
Razor can recognise self-closing tags:
@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
@(number * 10)<br />
}
}
If you do not want to render html tags, you can use the <text> tag to tell Razor where code ends and begins again. The <text> tag is not rendered to the browser:
@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
<text>@(number * 10) * 10 = @(number * 10)&nbsp;</text>
}
}
Comments within a code block can denoted by two forward slashes //, as can be seen in all the preceding examples. Alternatively, you can use /*...*/ or @*...*@. If you want to put a server side comment outside of a code block, precede the line @*
@{
/*Get numbers from 1 - 10*/
//Get numbers between 1 - 10
@*Get numbers between 1 - 10*@
var numbers = Enumerable.Range(1, 10);
foreach(var number in numbers){
@number
}
}
The following example illustrates two things - the first is commenting outside of code blocks using the @*...*@ syntax. The second is that iteration and selection statement keywords (if, for, foreach, switch, while etc) do not need curly braces before them. A simple @ sign will do. The same is true for try... catch, if you want to use that particular construct inline.
@* Get numbers between 1 - 10 *@

@{ var numbers = Enumerable.Range(1, 10); }

@
foreach(var number in numbers){
@number
}

@for(var i = 0; i < numbers.Count(); i++){
@numbers.ElementAt(i)
}

@if(numbers.Count() == 10){
@:10 Numbers - Good!
}

@{var condition = 1; var message = "";}

@
switch(condition){
case 1:
message =
"Case 1";
break;
case 2:
message =
"Case 2";
break;
case 3:
message =
"Case 3";
break;
default:
message =
"Default Case";
break;
}

@message
This article covers all of the basics needed to use Razor within ASP.NET Web Pages, and should provide a ready reference for those using the Razor View Engine within ASP.NET MVC 3 onwards. If you would like to know more about how the Razor parser actually works, and track its evolution, you should visit the blog of Dr Razor - Andrew Nurse.

Thursday, November 8, 2012

TFS Sunucu bağlantısı ve Aynı bilgisayardan farklı oturum

Aynı bilgisayardan aynı TFS sunucusuna farklı Active Directory accountları ile erişim yapmak

Active Directory Domaini içindeki bilgisayardan:
  • Visual Studio TFS Server Manager'dan server adresini remove edip
  • IExplorer'dan (diğer tarayıcılarda uyumluluk sorunları olabilir) tfs sharepoint adresini (örn: http://tfs:8080/tfs) yazıp girince, önceki domain accountu ile login olmuş olarak gelecek
  • Buradan sign-out olup pencereyi kapatalım
  • VS TFS Server Manager'dan TFS sunucuyu tekrar ekleyelim
Domainde olmayan bir bilgisayardan:
  • Visual Studio TFS Server Manager'dan server adresini remove edip
  • Denetim Masası -> Kullanıcı Yönetimi -> Kullanıcı Hesaplarını Yönet (ya da Control Panel -> User Accounts -> Credential Manager)
  • Kayıtlı olan hesap (tfs server adresini içeriyordur) silelim
  • VS TFS Server Manager'dan TFS sunucuyu tekrar ekleyelim

VS TFS Server Manager Penceresi



Thursday, June 7, 2012

WCF netTCPbinding için svcutil kullanımı

Burak Selim Şenyurt Hoca'nın şu makalesinde yazdığı herşeyi uygularız.

Dikkat etmemiz gereken şey ise:

- Client proxy service cs dosyasını oluştururken, svcutil aracına Servisin implemente edilmiş katmanını değil IService içeren, (yani servis sözleşmelerini-contracts- içeren) projeyi(katmanı) veririz. Servis kod implementasyonu sözleşmeden türetiliyor.

Friday, April 20, 2012

Visual Studio Solution'da WCF projesine Referans verdim almadı


Visual Studio Solution'umuzda birkaç tane katman projelerimiz ve bir de WCF Service projemiz var. Milleti birbirine refere ede ede güzel bir proje mimarisi oluşturduk ve son katrede service projesine referansları verdiiiik. Yazarken filan sorun yok, şıkır şıkır eklendi herşey.. eveet.. Autocompleting.. Süper.. Derleyeliiim:

Ama o da ne? Kara bir büyü gibi bir anda errorlar türemeye başladı: Filanca yok, falanca yok aceba eksik bir referansınız mı var? Eğer şanslıysanız ve "Error List" penceresinde Warning'leriniz de açıksa aşağıdaki uyarıyı görürsünüz, ama değilse "yaa ben bu referansları ekledim ya niye almıyor ki" diye uğraşır durursunuz.

Uyarı şöyle:

The referenced assembly "bişeybişey, Version=bilmemkaç, Culture=neutral, processorArchitecture=MSIL" could not be resolved because it has a dependency on "falanfilan, Version=birkaç, Culture=neutral, PublicKeyToken=kalabalikbiralfanümerik" which is not in the currently targeted framework ".NETFramework,Version=vX.X,Profile=Client". Please remove references to assemblies not in the targeted framework or consider retargeting your project.

Bu uyarıdaki kilit ifade vurguladığım yer. Client Frameworkde WCF ve WPF desteği yok.

Çözüm:

WCF Projesini
1- Sağ tık -> "Properties"
2- (Kuvvetle muhtemel ilk gelen sekme olan) "Application" sekmesi
3- Ya "Target Framework" = ".Net Framework X.X" (DİKKAT ".Net Framework X.X Client" olan DEĞİL)
3- Ya da: "Target Framework" altında "Client Profile..vs." diye bir checkbox kaldırma
4- Mutlu bir hayat

Friday, March 16, 2012

TFS'de çekip giden umarsız takım arkadaşı ya da "Başka Kullanıcı Değişiklik İptali"

Team Foundation Server, işin uzmanlarına göre VSS'den çok daha iyi bir Kaynak Kod Yöneticisi. (Yani sadece bu noktadan değerlendirince, çünkü TFS direkt olarak VSS ile kıyaslanamayacak kadar genişletilmiş bir araç.) Ancak kolay olan daha evlâ dedirtecek bazı durumlar da her zaman olmuyor değil:

Diyelim ki ekip olarak TFS kullanıyorsunuz. Ekipten biri ayrıldı ve siz aynı dosyalarda çalışmalar yapıp dosyanın daha düzgün sürümünü elde ettiniz. Ancak Source Control Explorer hep o dosyaların diğer kişide bekelemede olduğunu söyleyip duruyor. Hatta check-in lerinizden sonra da dosyanın kenarında güzel bir kilit ikonu yerine gıcık bi adam ikonu çıkıyor. Nasıl olacak da o değişiklikleri iptal ederiz?

Önce bu terimi türkçe olarak internette aramaya çalışırız; mesela "TFS Başka Kullanıcı Değişiklik İptal", tahmin edebileceğiniz gibi HİÇ kaynak bulunmaz. (Ta ki bu yazı yazılana kadar) Başka birkaç denemeden sonra, çat-pat ingilizcelerimizle ingilizce arama yaparsak, mesela: "TFS how to undo other users check-out" diye bir şansımızı deneyelim. Oley. Birsürü kaynak çıktı. Eminim biri işe yarar diye yeni onlarca sekme açmaya başlıyoruz. MSDN kaynaklı tüm yönlendirmelerde, garip bir Visual Studio Command Promt(VSCP) kullandırım hırsı olduğunu görünce, kendi kendimize "üf aman iyi bari olsun da komutla olsun" diye söylene söylene ve aynı zamanda üşene üşene 8 ya da 10 yere tıklayarak VSCP yi açıyoruz. (Bu konuda microsoft u çok tutarlı bulmuyorum. Bir yandan herşeyi arayüz programlarıyla basitleştirmekte olmayı felsefe edinen firma, diğer yandan nerdeyse her türlü düzenleme için VSCP açtırıyor nedense.) Sonra cins bir komut yazmaya başlıyoruz; öyle bir komut var ki, parametre olarak bir tek TCKimlik numarasıyla nüfus cüzdanı seri numarası girmediğimiz kalıyor. Uzun uzun yazdıktan sonra, işe yaramadığını (en azından benim durumumda) görüyoruz. 

Aramalara devam edince aslında çok daha basit bir yol olduğunu fark ediyoruz. Ancak bu arada 7 saate yakın bir zaman geçmiş oluyor. İşte sizin de bi 7 saatiniz gitmesin (ya da bir dahaki sefere en azından kendimin 7 saati daha gitmesin) diye yazıyorum:

Evvela TFS Sunucusu üzerinde  "Undo other users' changes"  ve  "Unlock other users' changes" haklarınız olmalı. Bu haklar nasıl yönetiliyor bu konuya girmek istemiyorum çünkü şu an 5.paragrafı yazdığımı ve hala konuya giremediğimi fark ettim.

TFS Power Tools (TFS 2010) ya da TFS Power Tools (TFS 2012)  kurulur. 

Daha sonra: 
  1. Source Control Explorer Açılır (Visual Studio içinde) 
  2. Tek dosyadaki değişiklik için dosya üzerinde, birden çok dosyada değişiklik için dosyaların bulunduğu dizin üzerinde sağ tıklanır
  3. Find in Source Control ve ordan Status seçilir
  4. Find in Source Control diyaloğunda, Status checkbox işaretli kalsın
  5. Aramayı daratlmak için Wildcart veya username alanında "Display files checked out to:" textbox'ına birşeyler yazılabilir
  6. Find tuşuna basılır ve böylece bir liste gelecektir
  7. Gelen listede undo edilecek öğeler seçilir
  8. Sağ tıklanıp Undo denir.
  9. "Undo all selected changes?" sorusuna da ne dememiz gerektiğini söylemek etik olmaz sanırım.
Bir de Team Foundation Sidekicks diye 3.parti bir tool dan söz ediyorlar ama ben denediğimde sürekli hata verip kapandı. Zaten böyle 3.parti şeyleri pek fazla sevmiyorum. (Tabi kişisel tercihimdir.)

Kolay gelsin.

Wednesday, December 28, 2011

ASPxComboBox SelectedItem null Oluyor ise, bunun da bir sebebi var !


Saatlerce süren ve gerilim artıran uğraşılar sonunda (belki kuytu köşe bir yerlerde dokümante edilen, belki edilmeyen bile, ve dahi aratınca google'da dahi çıkmayan) gafil bir konuda yeni bir post yazma ihtiyacı ivedilikle hasıl oldu:

Bir DevExspress gridine Edit Template yazıp, birden fazla DevExpress ComboBox kullanıyorum. Grid Event'lerinde bunlardan biri hariç diğerlerinin tamamının SelectedItem ve SelectedIndex özelliklerine güzel güzel erişiyorum. Ancak dediğim gibi: biri hariç!

Yazının başında söylediğim gibi, saatlerce süren uğraştan sonra sebebinin şuna dayandığını gördüm: ComboBox'ın ValueType özelliğini set etmeyince, (sanırım ViewState'e yazılmıyor ve dolayısıyla) seçilen değer post ya da call back esnasında uçup gidiyor. Böylece de yukarda yazdığım özellikler null oluyor.

Örnek kod:


     <dx:ASPxComboBox ID="DxMyCombo" runat="server" ClientIDMode="AutoID"  
TextFormatString="{0}" ValueField="ValueId"
ValueType="System.Int32" >
<Columns>
<dx:ListBoxColumn FieldName="ValueId" Visible="false" />
<dx:ListBoxColumn FieldName="Value01" />
<dx:ListBoxColumn FieldName="Value02" />
</Columns>
</dx:ASPxComboBox>


Eğer ValueType verildiği halde Postback(ya da Callback) durumlarında yine de değerini sürekli null okuduğumuz bir ASPxComboBox(bundan sonra combo diye anılacaktır) için;

 - Eğer kullanmakta olduğumuz combo, bir kontrolün içindeyse, sorun Sayfa Yaşam Döngüsü (Page LifeCycle). Okumaya çalıştığımız değere Load eventinde henüz hazırlanmamış oluyor. Bunu sebebi de Control Load'larının Page Loaddan sonra olması. Aslında denen odur ki, ViewState okuma işi Init eventinde olur. Eğer bu doğruysa, Control Initleri Page Loadında (hatta Page Initten bile önce) çoktan geçilmiş ve ViewState'in okunup değerlerin yüklenmiş olması beklenir. Ama her nedense böyle olmuyor ve çalışmakta olduğunuz asıl Page'inizin Load eventinde combo'nun değeri henüz yüklenmemiş oluyor.

Yani demem odur ki, eğer yukarıda bahsettiğim gibi ValueType'dan kaynaklanmayan bir neden den ötürü sayfaya yaptığınız Post ya da Callback'de combo değeri null ise, değer okumaya çalıştığınız eventi biraz daha erteleyin. (Ben kendi olayımda Load'da okuyamadığım için LoadComplete eventine kaydoldum ve burdan eriştim.)

Bir de eğer atama yapacaksanız,
   DxMyCombo.SelectedItem = DxMyCombo.Items.FindByValue(#DegerTipi)
kodunu önce mutlaka deneyin. #DegerTipi, yukarıda vurguladığım ValueType'a ne verdiyseniz o. (Yukarıdaki durum için int bir sayı.)

(Bu berbat tarzancadan dolayı da affınıza sığınırım)


Not: DevExpress konusunda yazdığım blog gönderilerindeki davranış özelliklerinin pek çoğu, belki ASP.Net WebControl base'inden geliyordur ve standart kontrollerde de vardır. Bu konuyu henüz bilmiyorum ancak DevExpress için yazdığım şekilde oluyor. İlerde boş bir zamanda oturup deneyip gönderiler üzerinde gerekli notları eklerim.

Tuesday, December 27, 2011

String.Format içinde Süslü Parantez ('{' veya '}') kullanımı

Eğer String.Format içinde süslü parantezli bir şeyler de göstermek istersek, yapmamız gereken tek şey parantezi 1 değil 2 tane yazmak. Bu durumda süslü parantezin Escape karakteri kendisi oluyor:

string susluParantezli = string.Format("Süslü parantez işaretleri: Açma işareti: {{, Kapama İşareti: }}");
//Çıktısı: Süslü parantez işaretleri: Açma işareti: {, Kapama İşareti: }