Reset your SQL Server login
Recently I faced a situation where the SQL Server was setup but no one knew the login, and the SQL server was not configured in Mixed Mode Authentication, so how do you recover from this situation other than re installing the instance,
Stop the running instance and then open up command prompt in Binn directory on the instance which would be something like
c:\Program Files\Microsoft SQL Server\MSSQL...\Binn
Run the following command
sqlservr.exe -m"SQLCMD"
This would start the instance in single user mode, now open up another command prompt in the same directory
and then run “SQLCMD”
and execute the following statements based on requirement
If you want to add a windows user use
CREATE login [DOMAIN\USERNAME] FROM windows; EXEC sys.sp_addsrvrolemember @loginame = N'DOMAIN\USERNAME', @rolename = N'sysadmin'; GO;
To add a SQL Server Login use (remember this works only if mixed mode authentication is enabled)
CREATE LOGIN [testAdmin] WITH PASSWORD=N'test@1234', DEFAULT_DATABASE=[master]; EXEC sys.sp_addsrvrolemember @loginame = N'testAdmin', @rolename = N'sysadmin'; GO;
now exit SQLCMD and also do CTRL+C on first window to stop instance and restart the instance in regular mode.
Zune Window in WPF
I have become a huge fan of Metro UI design and i really like the Zune interface and the starting point would be the custom chrome so i searched a bit and found this neat little thing , thought I would share
/// <summary> /// Borderless Window Behavior /// </summary> public class BorderlessWindowBehavior : Behavior<window> { #region Native Methods [StructLayout(LayoutKind.Sequential)] public struct MARGINS { public int leftWidth; public int rightWidth; public int topHeight; public int bottomHeight; } [DllImport("dwmapi.dll")] private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset); /// <summary> /// POINT aka POINTAPI /// </summary> [StructLayout(LayoutKind.Sequential)] public struct POINT { /// <summary> /// x coordinate of point. /// </summary> public int x; /// <summary> /// y coordinate of point. /// </summary> public int y; /// <summary> /// Construct a point of coordinates (x,y). /// </summary> public POINT(int x, int y) { this.x = x; this.y = y; } } [StructLayout(LayoutKind.Sequential)] public struct MINMAXINFO { public POINT ptReserved; public POINT ptMaxSize; public POINT ptMaxPosition; public POINT ptMinTrackSize; public POINT ptMaxTrackSize; }; /// <summary> /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class MONITORINFO { public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); public RECT rcMonitor = new RECT(); public RECT rcWork = new RECT(); public int dwFlags = 0; } /// <summary> Win32 </summary> [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct RECT { /// <summary> /// Win32 /// </summary> public int left; /// <summary> /// Win32 /// </summary> public int top; /// <summary> /// Win32 /// </summary> public int right; /// <summary> /// Win32 /// </summary> public int bottom; /// <summary> /// Win32 /// </summary> public static readonly RECT Empty = new RECT(); /// <summary> /// Win32 /// </summary> public int Width { // Abs needed for BIDI OS get { return Math.Abs(right - left); } } /// <summary> /// Win32 /// </summary> public int Height { get { return bottom - top; } } /// <summary> /// Win32 /// </summary> /// <param name="left">The left.</param> /// <param name="top">The top.</param> /// <param name="right">The right.</param> /// <param name="bottom">The bottom.</param> public RECT(int left, int top, int right, int bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; } /// <summary> /// Win32 /// </summary> /// <param name="rcSrc">The rc SRC.</param> public RECT(RECT rcSrc) { this.left = rcSrc.left; this.top = rcSrc.top; this.right = rcSrc.right; this.bottom = rcSrc.bottom; } /// <summary> /// Win32 /// </summary> /// <value> /// <c>true</c> if this instance is empty; otherwise, <c>false</c>. /// </value> public bool IsEmpty { get { // BUGBUG : On Bidi OS (hebrew arabic) left > right return left >= right || top >= bottom; } } /// <summary> /// Return a user friendly representation of this struct /// </summary> /// <returns> /// A <see cref="System.String"/> that represents this instance. /// </returns> public override string ToString() { if (this == RECT.Empty) return "RECT {Empty}"; return String.Format("RECT {{ left : {0} / top : {1} / right : {2} / bottom : {3} }}", left, top, right, bottom); } /// <summary> /// Determine if 2 RECT are equal (deep compare) /// </summary> /// <param name="obj">The <see cref="System.Object"/> to compare with this instance.</param> /// <returns> /// <c>true</c> if the specified <see cref="System.Object"/> is equal to this instance; otherwise, <c>false</c>. /// </returns> public override bool Equals(object obj) { if (!(obj is Rect)) return false; return (this == (RECT)obj); } /// <summary> /// Return the HashCode for this struct (not guaranteed to be unique) /// </summary> /// <returns> /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. /// </returns> public override int GetHashCode() { return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode(); } /// <summary> /// Determine if 2 RECT are equal (deep compare) /// </summary> /// <param name="rect1">The rect1.</param> /// <param name="rect2">The rect2.</param> /// <returns> /// The result of the operator. /// </returns> public static bool operator ==(RECT rect1, RECT rect2) { return (rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom); } /// <summary> /// Determine if 2 RECT are different (deep compare) /// </summary> /// <param name="rect1">The rect1.</param> /// <param name="rect2">The rect2.</param> /// <returns> /// The result of the operator. /// </returns> public static bool operator !=(RECT rect1, RECT rect2) { return !(rect1 == rect2); } } /// <summary> /// Gets the monitor info. /// </summary> /// <param name="hMonitor">The h monitor.</param> /// <param name="lpmi">The lpmi.</param> /// <returns></returns> [DllImport("user32")] internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); /// <summary> /// Monitors from window. /// </summary> /// <param name="handle">The handle.</param> /// <param name="flags">The flags.</param> /// <returns></returns> [DllImport("User32")] internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags); /// <summary> /// Wms the get min max info. /// </summary> /// <param name="hwnd">The HWND.</param> /// <param name="lParam">The l param.</param> private static void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) { MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // Adjust the maximized size and position to fit the work area of the correct monitor int MONITOR_DEFAULTTONEAREST = 0x00000002; System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); if (monitor != System.IntPtr.Zero) { MONITORINFO monitorInfo = new MONITORINFO(); GetMonitorInfo(monitor, monitorInfo); RECT rcWorkArea = monitorInfo.rcWork; RECT rcMonitorArea = monitorInfo.rcMonitor; mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left); mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top); mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left); mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top); } Marshal.StructureToPtr(mmi, lParam, true); } /// <summary> /// Defs the window proc. /// </summary> /// <param name="hwnd">The HWND.</param> /// <param name="msg">The MSG.</param> /// <param name="wParam">The w param.</param> /// <param name="lParam">The l param.</param> /// <returns></returns> [DllImport("user32.dll")] public static extern IntPtr DefWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam); #endregion private const int WM_NCCALCSIZE = 0x83; private const int WM_NCPAINT = 0x85; private const int WM_NCACTIVATE = 0x86; private const int WM_GETMINMAXINFO = 0x24; private HwndSource m_hwndSource; private IntPtr m_hwnd; public static DependencyProperty ResizeWithGripProperty = DependencyProperty.Register("ResizeWithGrip", typeof(bool), typeof(BorderlessWindowBehavior), new PropertyMetadata(true)); /// <summary> /// Gets or sets a value indicating whether [resize with grip]. /// </summary> /// <value> /// <c>true</c> if [resize with grip]; otherwise, <c>false</c>. /// </value> public bool ResizeWithGrip { get { return (bool)GetValue(ResizeWithGripProperty); } set { SetValue(ResizeWithGripProperty, value); } } /// <summary> /// Called after the behavior is attached to an AssociatedObject. /// </summary> protected override void OnAttached() { if (AssociatedObject.IsInitialized) AddHwndHook(); else AssociatedObject.SourceInitialized += AssociatedObject_SourceInitialized; AssociatedObject.WindowStyle = WindowStyle.None; AssociatedObject.ResizeMode = ResizeWithGrip ? ResizeMode.CanResizeWithGrip : ResizeMode.CanResize; base.OnAttached(); } /// <summary> /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. /// </summary> protected override void OnDetaching() { RemoveHwndHook(); base.OnDetaching(); } /// <summary> /// Adds the HWND hook. /// </summary> private void AddHwndHook() { m_hwndSource = HwndSource.FromVisual(AssociatedObject) as HwndSource; m_hwndSource.AddHook(HwndHook); m_hwnd = new WindowInteropHelper(AssociatedObject).Handle; } /// <summary> /// Removes the HWND hook. /// </summary> private void RemoveHwndHook() { AssociatedObject.SourceInitialized -= AssociatedObject_SourceInitialized; m_hwndSource.RemoveHook(HwndHook); } /// <summary> /// Handles the SourceInitialized event of the AssociatedObject control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> private void AssociatedObject_SourceInitialized(object sender, EventArgs e) { AddHwndHook(); } /// <summary> /// HWNDs the hook. /// </summary> /// <param name="hWnd">The h WND.</param> /// <param name="message">The message.</param> /// <param name="wParam">The w param.</param> /// <param name="lParam">The l param.</param> /// <param name="handled">if set to <c>true</c> [handled].</param> /// <returns></returns> private IntPtr HwndHook(IntPtr hWnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled) { IntPtr returnval = IntPtr.Zero; switch (message) { case WM_NCCALCSIZE: /* Hides the border */ handled = true; break; case WM_NCPAINT: { if (Environment.OSVersion.Version.Major >= 6) { var m = new MARGINS { bottomHeight = 1, leftWidth = 1, rightWidth = 1, topHeight = 1 }; DwmExtendFrameIntoClientArea(m_hwnd, ref m); } handled = true; } break; case WM_NCACTIVATE: { /* As per http://msdn.microsoft.com/en-us/library/ms632633(VS.85).aspx , "-1" lParam * "does not repaint the nonclient area to reflect the state change." */ returnval = DefWindowProc(hWnd, message, wParam, new IntPtr(-1)); handled = true; } break; case WM_GETMINMAXINFO: /* From Lester's Blog (thanks @aeoth): * http://blogs.msdn.com/b/llobo/archive/2006/08/01/maximizing-window-_2800_with-windowstyle_3d00_none_2900_-considering-taskbar.aspx */ WmGetMinMaxInfo(hWnd, lParam); handled = true; break; } return returnval; } } } </window>
Reading Metadata of the Buddy Class
Most of the time we would be using buddy classes for putting metadata for auto generated classes, for example:
Say if this is the autogenerated class
public partial class Person { public string FirstName { ..... } public string LastName {..... } public int Age { ..... } }
Our buddy class would be
public class PersonMetaData { [Display(Name="First Name")] public string FirstName { get; set; } [Display(Name="Last Name")] public string LastName { get; set; } [Display(Name="Age")] public int Age { get; set; } }
This is fine but what if we want to read this data back, if we use the Class.GetProperties() we do not get this data back so basically we would have to go through a hoop, but its fairly simple
PropertyInfo[] headerInfo = typeof(Person).GetProperties(); var attributesofclass = typeof(Person).GetCustomAttributes(true); for (int n = 0; n < headerInfo.Length; n++) { var attributesofbase = (System.ComponentModel.DataAnnotations.DisplayAttribute[])headerInfo[n].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute),true); if (attributesofbase.Count()== 0){ var medatadataofclass = (System.ComponentModel.DataAnnotations.MetadataTypeAttribute[])typeof(T).GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.MetadataTypeAttribute), true); if (medatadataofclass.Count() > 0) { var metadatatypeofclass = medatadataofclass.First().MetadataClassType.GetProperty(headerInfo[n].Name); if (metadatatypeofclass != null){ var metadataofproperty = (System.ComponentModel.DataAnnotations.DisplayAttribute[])metadatatypeofclass.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), true); } } } }
Asp.net Dyanamic Data : A leap for RAD
I have always basically forms over data for the longest period of time (LOB Apps) and most of the time its the same thing over and over again, Setup Database, create scaffolding forms for all the master tables and then move to the next steps, but wait there should be an easy way to this, In the MVC framework you can generate pages based on the model, but there are still a few things that you should wire up manually, enter dynamic data template and this feels like a magical unicorn at the beginning and once you dig deep into into it, its just beautiful, and will save a lot of steps for you.
So lets begin
You have 2 options a Linq2SQL based Application or Entity Framework based application and its just a matter of your preference, Then just create a data Context, This is what i did just to go through and this is not a perfect data model but you can get the point, just create your data context you are almost good to go
then you ll have to uncomment a single line in global.asax
DefaultModel.RegisterContext(typeof(DataModel), new ContextConfiguration() { ScaffoldAllTables = true });
Here the default property for ScaffoldAllTables is false, change it to true if you want scaffolding on all tables, (for now)
and you are done
And this is what you get , Projects and Tasks along with filter and foreign key correctly linked
Now lets customize this a little bit, we would never want all the scaffold all tables and also we would need some validation and hearer names to be changed a bit.
To Scaffold specific tables we will have to mark the tables with [ScaffoldTable(true)] property, and as the Datacontext generated classes are partials we can extend the classes in a seperate file also to provide metadata we will use data annotations and mark all the necessary fields with the required information
namespace TestApplication { [ScaffoldTable(true)] [MetadataType(typeof(Attributes.Project))] public partial class Project { } [ScaffoldTable(true)] [MetadataType(typeof(Attributes.Task))] public partial class Task { } namespace Attributes { public partial class Project { [Required] [StringLength(50, MinimumLength = 5)] [Display(Name = "Project Name")] public string ProjectName { get; set; } } public partial class Task { [Required] [Display(Name = "Project", Order = 0)] public Project Project { get; set; } [Required] [Display(Name = "Employee Code", Order = 1, GroupName = "Employee")] public string EmployeeCode { get; set; } [Required] [Display(Name = "Track Date", Order = 2, GroupName = "Date & Time")] public DateTime TrackDate { get; set; } [Required] [Display(Name = "Hours", Order = 3, GroupName = "Date & Time")] public decimal TaskHours { get; set; } [Required] [Display(Name = "Task Descriprion", Order = 4, GroupName = "Information")] public string TaskDescriprion { get; set; } } } }
The modified task screen would look like
And this is just the beginning we can do a lot more stuff as all the controls can be customized, I will post about grouping and also customizing display and edit controls in a subsequent blog.
Play with Clay
I have been a big fan of ExpandoObject ever since it was introduced with .net 4.0, and I have been using the Expando Object object ever since, but I always felt that it was not enough, ExpandoObject was fun and all but it was just not enough, and me being really lazy remember coying and pasting code just to loop through properties of a class using reflection and all that headache.
Enter Clay : The moment I have laid my eyes on this beautiful piece of code, I have become a huge fan, and it has all the things the expando should have been.
So How do you begin , Its really simple and also follows unique naming convention you begin with a clay object with New (emphasis on uppercase ‘N’)
dynamic New = new ClayFactory(); var cUser = New.User();
and thats it,
In Clay Indexer Syntax and Property Accessors are the same so
cUser.Name = cUser["Name"];
you can pass anonymous objects and also accepts named arguments, you can also use jQuery style chain able setters or put use them as an array
var cUser = New.User(new { Name = "Naresh", Mail = "something@mail.com" }); var cUser = New.User( Name : "Naresh", Mail : "something@mail.com"); var cUser = New.User().Name("Naresh").Mail("something@mail.com"); var Users = New.Array( New.User().Name("Naresh").Mail("something@mail.com"), New.User().Name("Rakesh").Mail("something@mail.com") );
So What are you waiting for get started at
clay.codeplex.com
Grooveshark
I always wanted to this and here it is , my first of the many posts with an Indian perspective on Gadgets and Apps (Desktop, Web and Mobile), and I thought let me start by a web app as web and cloud is the future.
Grooveshark
Grooveshark is an online music player with radio option also. The UI is simple enough and becoming a member is good as you can manage your music library online. There are lot of songs available and i found most of the latest songs available online. You can create own playlists, and manage most of the music online. The bandwidth requirements is not that high and the quality of the music is more than acceptable. Its a must for music fanatics, Radio also functions well and there are stations by genres but i found that all the music doesn’t directly fit into the genre you selected, There are additional subscription options if you want the service on cellphone and they have a mobile client for just about every platform, but your iOS must be jailbroken. Its a bit pricey though at $9.99 add with that the 3g Costs in India and you are better of listening to FM, but if you are the kind who just can’t live without music. Grooveshark is a great option.
Silverlight RIA: Validate Entity Server Side
If you are working with Validating a Entity , Simple Meta Data Validation is not always enough , you might have to do a server side validation, and it is really simple
Along with regular metadata add a Custom Validation Attribute which has type of class where your validation logic resides and String name of the Validation Function
[Required(ErrorMessage="Client Name is Required")] [StringLength(256)] [DisplayName("Client Name")] [CustomValidation(typeof(ClientValidations), "ValidateClientName")] public string ClientName { get; set; }
and a sample function for validation would be
public static ValidationResult ValidateClientName(string ClientName, ValidationContext context) { Models.DB.Client client = (Models.DB.Client)context.ObjectInstance; Web.Models.DB.PortalDataContext pc =new Models.DB.PortalDataContext(); var existing = pc.Clients.Where(c => c.ClientName == ClientName && c.Id != client.Id && c.Status == true); if (existing.Count() > 0) { return new ValidationResult("Invalid Client Name as the Client Name already Exists", new string[] { "ClientName" }); } return ValidationResult.Success; }
Silverlight : Binding a WebContext User Property to a DomainQueryParameter
In Domain Data Source if you want to send a parameter to the Query the simplest way to do this would be
{Binding Path=User.Proper, Source={StaticResource WebContext}}Example:
<riacontrols:domaindatasource AutoLoad="True" x:Name="dataSource" LoadSize="20" QueryName="GetClients" LoadingData="dataSource_LoadingData" LoadedData="dataSource_LoadedData" SubmittedChanges="dataSource_SubmittedChanges" > </riacontrols:domaindatasource><riacontrols:domaindatasource .DomainContext> <datasouce:portalcontext /> </riacontrols:domaindatasource> <riacontrols:domaindatasource .FilterDescriptors> <riacontrols:filterdescriptor PropertyPath="ClientName" Operator="Contains" Value="{Binding ElementName=TextFilter,Path=Text}" IsCaseSensitive="False"> </riacontrols:filterdescriptor> </riacontrols:domaindatasource> <riacontrols:domaindatasource .QueryParameters> <riacontrols:parameter ParameterName="AccessLevel" Value="{Binding Path=User.DataAccessLevel, Source={StaticResource WebContext}}"/> </riacontrols:domaindatasource>
Using Linq to Find a Control
I think Every one has one time or the other tried to find a control by looping over and find the required control, but we can use Linq to do the same thing.
public static class PageExtensions { public static IEnumerable<control> All(this ControlCollection controls) { foreach (Control control in controls) { foreach (Control grandChild in control.Controls.All()) yield return grandChild; yield return control; } } } </control>
Then you can use as a Linq Expression
var ctrls = controls.All().Where(c => c.GetType() == typeof(Button));
Mix and Mash Asp.net MVC with Webforms
A lot of people including me wanted to to get on the bandwagon of ASP.net MVC, but the main problem is we do not always get to start new projects and there is always a timeline hanging. I will not talk about the benefits of MVC Pattern as most of us already aware of it, But for an ASP.net Developer where everything is tied up in Webforms this may seem difficult, but once you start taking advantages of this pattern, the usefulness becomes obvious, me having worked on Rails and PHP frameworks such as CodeIgnitor and CakePHP, It was never a question of If, but when, and the best way to begin would be use your existing skills with webforms and start bringin in MVC Pattern, and before you know it you can be completely taking the benefits out of both worlds.
Webforms with MVC
If you are starting with a new project its really simple, start of with a new MVC Project in Visual Studio Add a New Webform run it and thats it no configuration required, the reason is that because MVC Framework is built on top of same ASP.net platform, it runs and the reason why the routing doesn’t try and hijack this request is because of the way it works, if the physical file of the request exists the request is always made to the aspx file, for better performance and save disk query on each .aspx request you can also add the following line in your global.asax
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); }
MVC with Webforms
But most of us never start with new projects right ?, so you have to do a bit more work, Add the following as Reference to your Web Application

Now Update your web.config to reflect
<system .web> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation> <pages> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> </namespaces> </pages> ...... </system>
Add the following code to global.asax
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); } void Application_Start(object sender, EventArgs e) { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); }
Now Add the Controllers, Views, Folders to the root of application and you are good to go:
Home Controller – /Controllers/HomeControllers.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace WebApp.Test.Controllers { [HandleError] public class HomeController : Controller { public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } } }
View – /Views/Home/Index.aspx
< %@ Page Language="C#" MasterPageFile="~/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server"> </asp:content> <asp:content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>< %: ViewData["Message"] %></h2> <p> To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. </p> </asp:content>
You can even use the same Master Page


P.S: The VS Project doesn’t support integrated way of creating Views and Controllers in this method






