Friday 25 July 2014

Restrict a Method To Members of Certain Roles

Simple Example

// Only Let People who are in the Administrator or Managers Roles Use this method
   [Authorize(Roles = "Administrator,Managers")]
        public ActionResult Delete(int id = 0)
        {
            Report Report = db.Report.Find(id);
            if (Report == null)
            {
                return HttpNotFound();
            }
            return View(Report );
        }

MVC 4 - Creating PDF Files with iTextSharp

I've found in my latest job that just about every project requires spitting out PDFs in various flavours so here's a simple example:

// First things first, make sure you've got the package installed
// Package Manager
PM> Install-Package iTextSharp

// In your Controller make sure you reference iTextSharp.text and iTextSharp.pdf
using iTextSharp.text;
using iTextSharp.text.pdf;

// Outputs a Simple PDF with the Name and Description of a given Product
    public FileStreamResult ProductInfoPDF(int id)
        {
        Product = context.Products.Find(id);
// if we don't find anything then just quit
            if (Product == null)
            {
                return null;
            }

            MemoryStream workStream = new MemoryStream();
            Document document = new Document();
           // Landscape Layout
            document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate());
            PdfWriter.GetInstance(document, workStream).CloseStream = false;
            document.Open();
            // Heading
            Paragraph pHeading = new Paragraph("Product Information");
            pHeading.Alignment = Element.ALIGN_CENTER;
            pHeading.Font.SetStyle(Font.BOLD);
            pHeading.Font.Size = 12;
            pHeading.SpacingAfter = 18f;
            document.Add(new Paragraph(pHeading));                  
            Paragraph p = new Paragraph("Some background about this product.");
            p.Font.SetStyle(Font.BOLD);
            p.Font.Size = 8;
            document.Add(p);
            // Product Name
            Paragraph pProductName = new Paragraph("Product Name: " + Product.Name);
            pProductName.Font.SetStyle(Font.BOLD);
            pProductName.Font.Size = 8;
            document.Add(pProductName);
            // Description
            document.Add(new Paragraph("\n"));
            document.Add(new Paragraph("\n"));
            Paragraph pDescription = new Paragraph("Description");
            pEquip.Font.SetStyle(Font.BOLD);
            pEquip.Font.Size = 8;
            document.Add(pDescription );        
            document.Close();
            byte[] byteInfo = workStream.ToArray();
            workStream.Write(byteInfo, 0, byteInfo.Length);
            workStream.Position = 0;
            return new FileStreamResult(workStream, "application/pdf") { FileDownloadName = "Product_" + Product.Id.ToString() + ".pdf" };

        }


// Add  a link in your View
  @Html.ActionLink("Print", "ProductInfoPDF","Products" ,new { id = Model.Id }, new { @class = "printLink"})

LINQ Kung Fu - Tips from t'coalface of t'Interwebs

I find myself constantly having to look up how to do things in LINQ that I find straightforward in SQL, so I'm making a note of them here. Hopefully someone else will find these useful.


Select Statements

Get List based on Category

// Get Products in a certain category
// same as SQL: select * from Products where CategoryId = CategoryId
    int CategoryId = 1;
    List<Product> Products = db.Products.Where(x => x.CategoryId == CategoryId).ToList();

Select a Single Value with Where Clause

// get the Price of the latest product entered with the Name: "Box of Blue Sparks"
// SQL Equivalent: select TOP 1 Price from Products where Name = 'Box of Blue 
// Sparks' ORDER BY CreatedDate DESC
string pName = "Box of Blue Sparks";
  var available = db.Products.Where(x => x.Name == pName).OrderByDescending(x => x.CreatedDate).Select(x => x.Price).FirstOrDefault();
                              

Select DISTINCT

// Get a list of Distinct Product Colours
// SQL Equivalent: SELECT DISTINCT(Colour) FROM Products WHERE Price is more then £10
List<string> ProductNames = db.Products.Where(x => x.Price > 10).Select(x => x.Colour).Distinct().ToList();

// Note to the Colonials, that is the correct way to spell COLOUR!

Select a Single Record

// Get the first product priced over £100
// SQL Equivalant: SELECT TOP 1 * FROM Products WHERE Price > 100
Product p = db.Products.Where(x => x.Price > 100).FirstOrDefault();
I'll add to this as I get further along the learning curve.

Update 08-01-2015

Get all Model Validation Errors via LINQ

This is very useful when debugging MVC Controller Methods.

var allErrors = ModelState.Values.SelectMany(v => v.Errors);

Tuesday 22 July 2014

MVC 4 Display Correct Date Format in Edit Mode

This works:

@Html.TextBox("DateOrdered", string.Format("{0:d}", Model.DateOrdered))

Monday 21 July 2014

MVC 4, EF5 Code First - Forcing a Decimal to x Number of Places

Stick this in your DB Context if you need to have EF recongise more than two decimal places.

  protected override void OnModelCreating(DbModelBuilder modelBuilder)  
     {  
       // We have a Decimal Field in Our SQL Table decimal(18, 4)  
       // By default only the first two digits after the decimal will be recognised if this property is set to type decimal  
       // we need to override this behaviour and here's how  
       modelBuilder.Entity<MyObjec t>().Property(f => f.totalWeightMg).HasPrecision(18,4);       
       base.OnModelCreating(modelBuilder);  
     }  

Wednesday 9 July 2014

Return Yes, No from Boolean instead of True, False

I recently needed to output Boolean values into an iTextSharp PDF document having them represented as Yes or No rather than True or False

Cue MSDN. This article Boolean Structure explains how to do this.

Here's a quick example:

bool JobDone = true;
string strJobDone = JobDone ? "Yes" : "No"; // Returns "Yes"