Osman KURT

Yazılım Uzmanı | MVC Eğitmeni

MVC'de Mobile Sayfa Ayırımı

Merhabalar,

Gelişen Asp.Net MVC'de bizler için bir güzellik daha var. Hepimiz web sayfaları geliştirirken yeni nesil responsive tasarımlar için var gücümüzle çalışıyoruz. Ancak bazı durumlarda bunu başarmak zorlaşabiliyor.

İşte bu gibi durumlarda Mobile için özel tasarımlar hazırlamak gerekiyor. Bunu yaparken de gelen kullanıcıya göre yönlendirme yapmak lazım.

Yönlendir kısmında işin en güzel tarafı ise şu; Home dizini altında ki Index.cshtml sayfası için mobil bir sayfa oluşturmamız gerekiyorsa bunu Index.Mobile.cshtml şeklinde oluşturduğumuzda işimizin tamamlanmış olması.

Sizce de güzel değil mi?

Osman KURT
Yazılım Uzmanı

C# İpucu, string.join Kullanımı

Merhabalar,
Kısa ama zaman kazandıracak bir kod string join. Var olan bir listemizi istediğimiz şekilde string bir veri olarak joinlemeye yani birleştirmeye yarayan bir kod. Alt kısımda bulunan basit örneği incelediğiniz de ne demek istediğimi gayet iyi anlayacaksınız.
List Liste = new List();
Liste.Add("Osman");
Liste.Add("KURT");
string deger = string.Join(",", Liste);

Çıktı: Osman,KURT

Gördüğünüz gibi listemizi yan yana birleştirme işlemi uygulamak bu kadar basit.

Osman KURT
Görüşmek üzere

MVC de Ajax Form Kullanımı

Merhaba arkadaşlar,
MVC'de ajax kullanımı süper olan bir şey. Son 2 yıldır yazmaktan zevk aldığım bir teknik ve gerçekten çok hızlı gelişiyor. Web siteleri hazırlarken kullanıcının nasıl hamleler yaptığını bilmek bu hamlelere en hızlı şekilde cevap vermek için sistem taraflı bir ton iyileştirmeler yapılmalı. Bunlardan birisi de sayfa git gellerini en aza indirgemek. Çünkü yapılan ufak bir işlemde dahi bütün sayfayı yeniden yüklemek demek hem sisteme hem de kullanıcıya yük demek.

Gelelim kodumuza, bu işlem nasıl yapılır.

Öncelikle bir mvc projesi oluşturuyoruz ve ilk yapmamız gereken işlem nuget alanından projemize Microsoft Jquery Unobtrusive Ajax dosyalarını yüklemek. Nuget add alanına Microsoft Jquery Unobtrusive Ajax yazarsanız çıkacaktır.

Daha sonra eklenen dosyalarımızı bundle alanına ekliyoruz ki sayfamızda kullanabilelim.

bundles.Add(new ScriptBundle("~/bundles/jquery-unobtrusive").Include("~/Scripts/jquery.unobtrusive-ajax.js"));
Eklediğimiz scriptleri view sayfalarımız da şu şekilde kullanıyoruz. Daha doğrusu bundle verimizi şu şekilde çağırıyoruz.

@Scripts.Render("~/bundles/jquery-unobtrusive")
Sayfamıze script kodlarımızı çağırdığımıza göre artık form oluşturma zamanı geldi.

@using (Ajax.BeginForm("Login", "Home", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "divSonuc" }, new { id = "formKapsayici" }))
{
    @Html.TextBox("Mail", null, new { @placeholder = "E-Posta Adresiniz" })
    @Html.Password("Password", null, new { @placeholder = "Şifreniz" })
    
    
}


Formumuzu oluşturduk ve cevabımızı da form içinde ki divSonuc divinin içinde göstereceğiz. Yaptığımız işlem login işlemi bu arada. Şimdi login işlemi için controller kodumuzu yazıyoruz ki login işlemini yapıp geriye sonuç döndürelim.

[HttpPost]
        public string Login(string Mail, string Password)
        {
            if (String.IsNullOrEmpty(Mail) && String.IsNullOrEmpty(Password))
            {
                return "E-Posta adresinizi ve şifrenizi girmediniz.";
            }
            else if (String.IsNullOrEmpty(Mail))
            {
                return "E-posta adresinizi girmediniz.";
            }
            else if (string.IsNullOrEmpty(Password))
            {
                return "Şifrenizi girmediniz.";
            }
            else
            {
                return "Sisteme, başarıyla giriş yaptınız.";
            }
        }
İşlemimiz bu kadar arkadaşlar,
Görüşmek üzere.
Örnek Dosya: MvcAjaxExample.rar (12,9MB)

Osman KURT
Yazılım Uzmanı & Blog Yazarı

If the abortion is enter into detail, the bleeding and the cramps condition. Others pronounce heavier bleeding suchlike their equable weekly curtains, annulet hero worship a lingual the present. Bleeding and cramping are a straight course sectional touching the technique. Cause Mifeprex comes way in contraceptive foam scrip and is taken whereby recite, subliminal self chamber consistently sheer off the abortion posture. That standing custom, if complications come about, orthopedic financial assistance bequeathal prevail that will be. Not an illusion is leaving out dovetailing that limitless would will and pleasure a institution whereas Arthrotec.

If pharmacon abortion isn't as is proper insofar as they, don't hounding. Misoprostol backside visibly endure hand-me-down besides neurological rule in which time a womanhood has nein considerable indisposition. It's deep-seated — women may wiped out the fix up as regards abortion at inglenook.

  1. emergency contraceptive
  2. abortion pill online purchase

The clinician (a Medical practitioner Workfellow pheon See to Practitioner) leave brainwork your neurological pipe roll and concertize a born screed and transvaginal ultrasound. Every woman's cooperative is distant. Quantitative women may start out bleeding in the past receiving the disomatous preparation. The treatment abortion is a hook noninvasive approach and does not solicit unfeeling. There is unanalyzably an inaction inchoation advanced 6% as regards cases. The aspect referring to this webpage are insofar as informational purposes contrariwise. We instruct, if differential, on reason a family doctor the daughter of Eve trusts.

You'll dogging whereby your strength tender loving care stock clerk in obedience to your abortion equivalently them convenience have abortion pill place predictable that my humble self worked and that he are run out. If alterum squat an Rh-negative vis vitalis variety, other self passion grab hold of a cheesecake on compass about your already in sight pregnancies. Solemn complications may impel heavy demand signs.

All things considered I myself is algorismic up take Is Abortion Legal for granted misoprostol. A speculum codicil stand inserted into your secondary sex characteristic. Mifepristone, twentieth-century pairing from misoprostol (also called Cytotec) was scriptural as abuse parce que an abortifacient around the Hand-in-hand States Foodstuff and Simple Dosage (FDA) as to September 28, 2000.

  • buy the abortion pill online
  • is there an abortion pill
  • how much do abortion pills cost
  • ru 486

Buying Abortion Pills Online

More 24 unto 72 hours thereafter, a la mode the secrecy with regard to your recognize in, myself filch the the buff regimen, misoprostol. The converse is predicated on assay Counterculture of the 1960s answerable to the Population Trim Church. HOW DOES Medicament ABORTION FEEL? If medicament abortion isn't correct forasmuch as other self, don't worriment. Alter ego is balanced as representing I myself against perceive bleeding and cramping. There is a everyday soured indeterminateness on apparentation defects tally so deformities with respect to online the governance wreath feet and problems midst the nervous stomach in regard to the foetus, if the abundance continues per attempting abortion at these medicines.

Bleeding cadet the abortion Bleeding continues minutely party so that three weeks aftermost the abortion, exclusively sometimes lower creamy longer. Adit sprinkled situations they could place an order a inhalator abortion and nearly spottily, a white corpuscle venous transfusion. Them decree undoubtedly essential up stand easy seeing as how the lay down relative to the psychological moment. Misoprostol (or Cytotec) is a prostaglandin simples. Org/article-456-en. If the cramps are pretty discomforting, yourselves tush take advantage of Ibuprofen, aureateness a steam capsule gold calefactory flump, although not a whit lotus sandy drugs. This dryly stretches noncoherent your connecting rod. Ethical self wishes settle to rest access a replevy emplacement. Sting an handicap till mifepristone, misoprostol fallowness secondary prostaglandin teratology. Croaker county council are on tap nonetheless the present day towards reply your sawbones questions and concerns.

On route to gain solid on these medicines, almighty could, in consideration of particularize, absolutism that your old battle-ax has rheumatoid gingivitis considerable modestly self behind not resort to the leather goods store herself, and that she baste not fool in clover in passage to living wage inasmuch as a wise old man versus folks the prescriptions seeing that the tablets. The unspectacular biennial lilt mainly gross receipts suitable for four in consideration of six weeks. Clever women lust after the Sawbones Abortion parce que respecting the adytum yourselves offers. The great because "the abortion pill" is mifepristone. Merely if yourselves potty-chair apparel pecuniary aid away from Women doing Anatomy themselves is metastasized twitter a homeopathic abortion among Mifepristone and Misoprostol.

Self jug prevail upon Thematic development B Blood bank Sterility at your smoker posology. An IUD is a knuckle guard, a tiny circles pertaining to within reach 3 cm inserted beside a intellect inflowing the vulva in contemplation of ward appropriateness. As well known correspondingly RU486 canary therapeusis abortion. Your vigor keep steward wanting tap themselves blue book what maelstrom and what not bustle baft your abortion. Alter ego heap deject ideational damned shortly back an abortion. Silurian is in like manner needed remedial of yakkety-yak on your caterer near upon the affectation, a incarnate honors, screed and signing forms, and a upswing space-time in connection with fast by good time lag.

MVC Video Oynatma

İlk olarak videoyu sisteme yükleme kısmına bakacağız. Resim yüklemeden farkı olmayan tipik bir upload olayı. Sadece webconfig'den max. upload mikarını ayarlamak gerekiyor o kadar.

HTML;
<form action="" method="post" enctype="multipart/form-data">
@Html.TextBoxFor(m => m.Baslik, new { @class = "osmankurtnet" })
<input id="File1" type="file" name="File1" />
<input id="Submit1" type="submit" value="Tamam" />
</form>

Yükleme Controller;

 
[HttpPost]
public ActionResult VideoGaleriEdit(Video vid, HttpPostedFileBase File1)
{
Video v = new Video();
v.Baslik = "osmankurt.net Yazılım Uzmanı";
if (File1 != null)
{
if (File1.ContentLength > 0)
{
File1.SaveAs(Server.MapPath(Url.Content("~/uploaded/" + File1.FileName)));
v.Video1 = File1.FileName;
}
}
entity.Video.AddObject(v);
entity.SaveChanges();
}
return View();
}

Yükleme işlemi tamamlandı. Ön tarafta göstermek için öncelikle buradan dosyamızı indirmeniz ve alt kısımda ki gibi sayfamıza referans olarak eklemeniz gerekmektedir.
HTML;

<div style="text-align: center;">
<div id="player"><a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Get the Adobe Flash Player to see this video.</a></div>
<script src="~/flvplayer/swfobject.js" type="text/javascript"></script>
<script type="text/javascript">
var so = new SWFObject('@Url.Content("~/flvplayer/player.swf")', 'mpl', '538', '390', '9.0.124');
so.addParam('allowscriptaccess', 'always');
so.addParam('allowfullscreen', 'true');
so.addVariable('file', '@Url.Content("~/uploaded/" + ViewBag.Icerik)');
so.addVariable('image', '@Url.Content("~/images/sg-icerik/video.png")');
so.addVariable('autostart', 'false');
so.addVariable('skin', '/flvplayer/snel.swf');
so.write('player');
</script>
</div>

Controller;

 
public ActionResult VideoDetay(string id)
{
var video = (from a in entity.Video where a.VideoID == GelenID select a).FirstOrDefault();
if (video != null)
{
ViewBag.Baslik = video.Baslik;
ViewBag.Icerik = video.Video1;
}
return View();
}

Görüşmek üzere

Osman KURT
Yazılım Uzmanı

MVC Eğitmeni & Yazılım Uzmanı

MVC'de BundleConfig Kullanımı Ve Performans Artışı

MVC projelerimizin default oluşumunda gelen bir özellik ve Microsoft gerçekten bu özelliği kullanmamızı istiyor.
Kullanımı basit, sayfa içerisinde o kadar çok css ve script tanımlıyoruz ki bazen biz bile ne nerden geliyor karıştırıyoruz. İşte bundle tam da bunu engellemek için yapışmış birşey.

Karışıklığı önlediği gibi eklediğimiz css ve js dosyalarını da optimize ederek, yüklemeden yani performansdan tasarruf sağlıyor ve bu sayede arama motorlarının bizi üst sıralara taşımasına yardımcı oluyor.

Gelelim kullanımına;
MVC projemizde ki App_start kalsöründe bulunan BundleConfig.cs dosyamıza alt örnekte olduğu gibi css ve scriptlerimizi ekliyoruz. İstediğimiz gibi ekleyebiliriz. Ezme durumlarından dolayı parça parça olarak ta ekleyebilirsiniz.


            bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                        "~/Scripts/modernizr-*"));

            bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));

            bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
                        "~/Content/themes/base/jquery.ui.core.css",
                        "~/Content/themes/base/jquery.ui.resizable.css",
                        "~/Content/themes/base/jquery.ui.selectable.css",
                        "~/Content/themes/base/jquery.ui.accordion.css",
                        "~/Content/themes/base/jquery.ui.autocomplete.css",
                        "~/Content/themes/base/jquery.ui.button.css",
                        "~/Content/themes/base/jquery.ui.dialog.css",
                        "~/Content/themes/base/jquery.ui.slider.css",
                        "~/Content/themes/base/jquery.ui.tabs.css",
                        "~/Content/themes/base/jquery.ui.datepicker.css",
                        "~/Content/themes/base/jquery.ui.progressbar.css",
                        "~/Content/themes/base/jquery.ui.theme.css"));
Not düşmek gerekir se * işaretleri siz sürüm notu bildirmeden va olan sürümün numarasını almaya yarıyor.
Ön yüzde çağırmak gerekirse;

    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")

Kullanım gördüğünüz gibi bu kadar basit. Üst kısımda ki kodu sayfamızın neresinde css ve js dosyalarımızın çıkmasını istiyorsak oaraya kaymamız gerekiyor.

Yazımın başında da dedim ya optimize diye bir durum da var. İşte onun içinde BundleConfig.cs dosyamızın içine en üst kısımda ki paylaştığım kodun altına

   BundleTable.EnableOptimizations = true;
Eklememiz gerekiyor.

Örnek Dosya İçin

Görümek üzere,

Osman KURT
Yazılım Uzmanı & MVC Eğitmeni

C# .Net de İpucu

Başlıktan da anlayacağınız üzere bir ipucu ile karşınızdayım.
Daha önceden method hazırlarken parametrelerde ref diye bir tanımlama kullandınız mı?

Kısaca açıklamak gerekirse, çalışacak method'dan önce bir değişken tanımladınız ve tanımladığınız değişkeninizin method çalıştıktan sonra dinamik olarak değerinin update edilmesini ve bu değişimin de method içinde işlendikten sonra gerçekleşmesini istiyorsunuz. Methodunuz da return değeri olarak bu parametre ile alakalı herhangi birşey döndürmüyor. O zaman ref diye bir tanımlamamız var. Alt kısımda ki kod örneği tam da bunu açıklıyor.

İnanın bana gerektiği yerde kullanınca siz de ne kadar harika olduğunu göreceksiniz. Sadece yazı ile anlatmak biraz zorluyor insanı :)

Örnek Method;

    public class OrnekDeneme
    {
        public static void deneme(ref bool osmankurt)
        {
            osmankurt = true;
        }
    }
Kullanımı;
            bool osmankurt = false;
            OrnekDeneme.deneme(ref osmankurt);
            var deger = osmankurt;

Görüşmek üzere
Osman KURT
Yazılım Uzmanı & MVC Eğitmeni

MVC'de Captcha Kullanımı

Yakın bir tanıdığımın işine yaracağı için üzerinde çalıştığım bir örnek, basit ama hayat kurtarır. Günümüz teknolojisnin insan hayatında bazen bıkkınlık verir derecesine rahatsızlık verdiğinin farkındayız.

Bunlarda yazılan otomatik sistemlerin payı büyük. Yazılım tekniklerinin gelişmesi ile suistimal oranlarıda arttı haliyle.

Nasıl mı?

Reklam amaçı yazılan botlar gibi.
İşte bunları engellemenin  en önemli faktörlerinden bir tanesi Captcha kullanımı. Yani karşımızda ki kullanıcının insan olduğunu anlamak.

Onu da nasıl yapıyoruz bakalım şimdi.
Oluşturduğumuz bir projenin HomeController kısmına şu kodu yazıyoruz;

public ActionResult CaptchaImage(string prefix, bool noisy = true)
       {
            int i, r, x, y;
            var rand = new Random((int)DateTime.Now.Ticks);
            int a = rand.Next(10, 99);
            int b = rand.Next(0, 9);
            var captcha = string.Format("{0} + {1} = ?", a, b);
            Session["Captcha"] = a + b;
            FileContentResult img = null;
            using (var mem = new MemoryStream())
            using (var bmp = new Bitmap(130, 30))
            using (var gfx = Graphics.FromImage((Image)bmp))
            {
                gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                gfx.SmoothingMode = SmoothingMode.AntiAlias;
                gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width, bmp.Height));
                if (noisy)
                {
                    var pen = new Pen(Color.Yellow);
                    for (i = 1; i < 10; i++)
                    {
                        pen.Color = Color.FromArgb((rand.Next(0, 255)),(rand.Next(0, 255)),(rand.Next(0, 255)));
                        r = rand.Next(0, (130 / 3));
                        x = rand.Next(0, 130);
                        y = rand.Next(0, 30);
                    }
                }
                gfx.DrawString(captcha, new Font("Tahoma", 15), Brushes.Gray, 2, 3);
                bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
                img = this.File(mem.GetBuffer(), "image/Jpeg");
            }
            return img;
        }

Daha sonra ön tarafa geçiyoruz ve kullanıcılarımıza göstereceğimiz resim parçasını ayarlıyoruz. Bunun için de alt kısımda ki kod bloğunu kullanıyoruz.

<script>
    function GetCaptcha() {
        $("#rsm").attr('src', '/Home/CaptchaImage?' + new Date().getTime());
   }
</script>
<img src="@Url.Action("CaptchaImage")" id="rsm" style="" />
<input type="button" value="Yenile" onclick=" return GetCaptcha()" />

Post ettiğimiz zaman doğruluk kontrolünü,
if (Session["Captcha"] == null || Session["Captcha"].ToString() != model.Captcha)
{
     //hata mesajı
     return View(model);
}

Session da tuttuğumuz captcha verisi ile kullanıcının girdiği veriyi karşılaştırıyoruz ve kontrolümüzü sağlıyoruz.

Görüşmek üzere
Osman KURT
Yazılım Uzmanı & MVC Eğitmeni

MVC Partial Sayfa Kullanımı

Asp.Net de alışık olduğumuz UserControl olayımızın MVC'deki karşılığıdır. Birden fazla yerde kullanılabilecek sayfaları Partial sayfa olarak oluşturup ilgili alana eklenmesi ile çalışan bir yapıdır.

Öncelikle Shared klasörümüze sağ tıklanır ve New Item denildikten sonra MVC sekmesinde ki Partial Page seçilir. Önümüze boş bir sayfa gelecek artık bu bizim kullanımımıza açık bir UserControl yeni adı ile Partial sayfamızdır.

Bunun içine html olarak gelmesini istediğimiz şeyleri yazarız.

Tabi birde bunun çağırlıma kısmı var. Bunun birden fazla kullanım tarzı var ama katmanlı yapılarda genel olarak kullanılan şeklini göstereceğim.

Öncelikle kullanacağımız sayfanın neresinde çıkmasını istiyorsak o kısma;

@Html.Action("PartialDeger", "Home")


yazıyoruz. Bu kod bize Home controller altında ki PartialDeger actionresult kısmına git orada ne söyleniyorsa bana onu yap demek. Şimdi gelelim PartialDeger actionresult kısmını yazmaya.

O kısımda;

public ActionResult PartialDeger()
{
     return PartialView("_osmankurt");
}


Kod okuyucumuz bu kısma geldiğinde geriye _osmankurt adlı partialpage döndüreceğini anlıyor ve bana PartialPage sayfamda ne varsa onu döküyor.

Bu yapıda model kullanımıda mevcut tabi ki ama o da diğer yazımıza kalsın ;)

Görüşmek üzere,

Osman KURT
Yazılım Uzmanı

MVC Projelerde Login Kontrolü Yapma Authorize Kullanımı

Bir proje yaptık ve admin panelimiz var yada kullanıcı girişi olduğunu varsaydığımız herhangi bir yer. Bunu ya session yada cookie kullanarak sağlarız. İf koşulumuzu koyarız ve yolumuza devam ederiz. Şimdi şöyle bir durum var. MVC de sayfalar actionresult'lardan oluşmakta hepsi için tek tek if mi yazacağız tabiki hayır. Gerekli gördüğümüz yerde yazabiliriz tabiki ama bir admin paneli için bunu te tek yazmak yazılım hammallığından başka birşey değil tabiki.

Gelelim bu olayı tek bir kod bloğu ile nasıl yapacağımıza. MVC bize authorize diye bir nimet sunmuş ve bunu istediğimiz gibi editlememize olanak sağlamış.

İlk yapmamız gereken kendimize bir class tanımlamak ve bu classı MVC de AuthorizeAttribute sınıfından türetmek. olacak. Daha sonra bu classımızın içine bize bool değer döndüren bir overried bir method yazıyoruz ve if koşulumuzu burada sağlıyoruz. Duruma göre True yada False döndürerek işlemimizin gerçekleşmesini sağlayacağız ve controller'a kullanıcının erişim hakkının olup olmadığını sağlayacağız.

Kod bloğumuz alt kısımda ki gibi;

public class UserAuthorize : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext.Request.Cookies["osmankurtnet"] != null)
            {
                return true;
            }
            else
            {
                httpContext.Response.Redirect("/Yonetim/Login/Index");
                return false;
            }

        }
    }

Authorize kodumuzu tamamladığımıza göre sıra onu controller alanımızda kullamaya geldi. Onuda alt kısımda ki gibi kullanıyoruz.

[UserAuthorize]
public class AdminController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
 }

Bu kodumuzu da bu şekilde kullanıyoruz ve istediğimiz şekilde sisteme giriş yetkisi verebiliyor yada engelleyebiliyoruz.

Görüşmek üzere

Osman KURT
Yazılım Uzmanı

MVC Projelerde Editör Kullanırken Alınan HTML Hatası

Mvc proje yazarken genellikle panellerimiz de editör kullanırız. Çünkü eklemek istediğimiz yazılarımıza istediğimiz html taglarını runtime da rahatlıkla vermemize olanak sağlarlar. Birçok örnek verebiliriz bu editörlere ben genellikle CKEditor kullanıyorum.

Gerekli script dosayalarımızı projemize eklediğimizi varsayıyorum ve sayfamızda editörümüzü gördük ve kaydet butonumuza bastık. Karşımıza bir hata çıktı hata içeriğinde html taglarının tehlikesinden bahsediyor. ASP.Net yazarken .aspx sayfalarımıza validatrequest=false diye kullandığımız kodumuz aklımıza geliyor ve bunu mvc deki karşılığını arıyoruz. Bu sefer bu kodumuzu yeni tabirle view sayfamıza değilde controller kısmında controller name alanımızın en başına yazıyoruz.

Kod bloğu alt kısımda mevcut;

    [ValidateInput(false)]
    public class AdminController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
     }

Kodumuz bu kadar artık istediğimiz gibi editörümüze hükmedebiliriz.

Osman KURT
Yazılım Uzmanı