Twitter Weekly Updates for 2010-04-11
- quake 2 on javascript ! http://googlewebtoolkit.blogspot.com/2010/04/look-ma-no-plugin.html #
Powered by Twitter Tools
Powered by Twitter Tools
The two addons that I can not live without in Sql Server and that, more , are free :
The SSMS Tools Pack maintains a history of your commands . More, it saves on the C:\SSMSTools\SQLQueryActionLog
The Sql Search finds a text in the objects in the database – very useful if you decide to change a column name and find all stored procedures that have this reference
Powered by Twitter Tools
It’s the second year that I am MVP for C# for Romania – and I feel good about it!
Thursday, April 01, 2010
Re: Andrei Ignat, Most Valuable Professional, Visual C#
To whom it may concern,
It is with great pride we announce that Andrei Ignat has been awarded as a Microsoft® Most Valuable Professional
(MVP) for 4/1/2010 – 4/1/2011. The Microsoft MVP Award is an annual award that recognizes exceptional
technology community leaders worldwide who actively share their high quality, real world expertise with users and
Microsoft. All of us at Microsoft recognize and appreciate Andrei’s extraordinary contributions and want to take this
opportunity to share our appreciation with you.
With fewer than 5,000 awardees worldwide, Microsoft MVPs represent a highly select group of experts. MVPs
share a deep commitment to community and a willingness to help others. They represent the diversity of today’s
technical communities. MVPs are present in over 90 countries, spanning more than 30 languages, and over 90
Microsoft technologies. MVPs share a passion for technology, a willingness to help others, and a commitment to
community. These are the qualities that make MVPs exceptional community leaders. MVPs’ efforts enhance
people’s lives and contribute to our industry’s success in many ways. By sharing their knowledge and experiences,
and providing objective feedback, they help people solve problems and discover new capabilities every day. MVPs
are technology’s best and brightest, and we are honored to welcome Andrei as one of them.
To recognize the contributions they make, MVPs from around the world have the opportunity to meet Microsoft
executives, network with peers, and position themselves as technical community leaders. This is accomplished
through speaking engagements, one on one customer event participation and technical content development.
MVPs also receive early access to technology through a variety of programs offered by Microsoft, which keeps
them on the cutting edge of the software and hardware industry.
As a recipient of this year’s Microsoft MVP award, Andrei joins an exceptional group of individuals from around the
world who have demonstrated a willingness to reach out, share their technical expertise with others and help
individuals maximize their use of technology.
Sincerely,
Rich Kaplan
Corporate Vice President
Customer and Partner Advocacy
Microsoft Corporation
Since I am active on asp.net/mvc I find many peoples asking about
For answering, I have made a small application with MVC2 in order to detail my answer.
First the problem :
You have Employees and Department.Each Employee belongs to an Department (let’s forget the fact that the employee can belong for a final date to the Department or any other life ideas)
The request is to create and view Employees .(forget delete,update – if I will have time and/or by general request , I will do this also this)
The database:
The beginning of the application :
First Layer , Data Access Layer
I use EF 3.5 (not 4.0 with POCO style – because is not ready yet) and make an edmx file and let EF put his classes.
You can use also ADO.NET with StoredProc, L2S, NHibernate or any other ORM you want.
Second Layer,Business Logic :
This is the layer where the logic should intervene (e.g., the name should be not null ).
Here is the list for Employee :
namespace BusinessLogic { /// <summary> /// TODO : add IDataErroInfo in order to validate /// TODO : add the department /// </summary> public class Employee { public long ID; public string Name { get; set; } public Department Department{ get; set; } public void SaveNew() { //TODO : validate before save //TODO : automapper using (DAL_EF.testsEntities te = new DAL_EF.testsEntities("name=myconnection")) { DAL_EF.Employee e = new DAL_EF.Employee(); e.Name = this.Name; //TODO : what if dept. deleted ? e.Department =te.Department.Where(d=>d.ID== this.Department.ID).FirstOrDefault(); te.AddToEmployee(e); te.SaveChanges(); } } } public class EmployeeList : List<Employee > { public void Load() { using (DAL_EF.testsEntities te = new DAL_EF.testsEntities("name=myconnection")) { foreach (var emp in te.Employee.Include("Department")) { //TODO : use automapper Employee e=new Employee() { ID = emp.ID, Name = emp.Name }; e.Department=new Department(){ ID=emp.Department.ID,Name=emp.Department.Name}; this.Add(e); } } } } }
Please pay attention for Load procedure in EmployeeList : it uses the first layer, DAL, but it can use any ORM framework.
Third layer, ViewModel:
Because all the views for employees will need a select list for department ( either for sorting, creating or updating) I have put a base ViewModel class that retrieves the list of Departments:
namespace MVCAppEmp.Classes { public class ViewModelEmployee { public static SelectList ListOfDepartments { get { //TODO : put this into cache to not load every time DepartmentList dl = new DepartmentList(); dl.Load(); return dl.SelectFromList(x => x.ID.ToString(), y => y.Name); } } } public class ViewModelEmployeeCreate : ViewModelEmployee { public Employee emp=new Employee(); } public class ViewModelEmployeeList : ViewModelEmployee { public EmployeeList employees; public void Load() { employees = new EmployeeList(); employees.Load(); } } }
Fourth Layer , MVC itself – view and controller :
<% =Html.ValidationSummary() %> <% using (Html.BeginForm()) { %> <h2>Create</h2> List of departments : <% =Html.DropDownList("DepartmentID", MVCAppEmp.Classes.ViewModelEmployee.ListOfDepartments)%> <%=Html.EditorFor(model => model.emp)%> <input type="submit" value="create" /> <%} %>
and the controller
// POST: /Employee/Create // TODO: make a binding for employees [HttpPost] public ActionResult Create(Employee emp,long DepartmentID) { try { emp.Department = new Department() { ID = DepartmentID }; emp.SaveNew(); return RedirectToAction("Index"); } catch(Exception ex) { ModelState.AddModelError("", ex.Message); return View(new ViewModelEmployeeCreate(){emp=emp}); } }
So to answer the questions :
You will find attached the application and the sql to create the database :
For MVC2 /MVC 3
http://msprogrammer.serviciipeweb.ro/wp-content/uploads/ASP.NETMVCORMandViewModels_135E/emp.zip
For MVC 4
http://msprogrammer.serviciipeweb.ro/wp-content/uploads/ASP.NETMVCORMandViewModels_135E/empMVC4.zip
What to do next, in order to familiarize yourself :
1. Make the update of the employees .Create view, save.
2. Filter the list of the employees on department. Search for all employees beginning with A that belong to IT department.
3. Search for TODO’s : there are part of other tutorials – but it will help you in MVC (and other!) development
This post have a continuation here:
http://msprogrammer.serviciipeweb.ro/2010/07/05/asp-net-mvc-and-dos-re-using-the-viewmodels/
These are my extensions.
public static MvcHtmlString DropDownListNull(this HtmlHelper html, string Name, SelectList select, object htmlAttributes) { if (select == null) return MvcHtmlString.Empty; else return html.DropDownList(Name, select, htmlAttributes); }
#region enum to list private static List<KeyValuePair<long, string>> FromEnum(this Type e) { List<KeyValuePair<long, string>> kvp = new List<KeyValuePair<long, string>>(); foreach (var s in Enum.GetValues(e)) { kvp.Add(new KeyValuePair<long, string>((int)s, s.ToString())); } return kvp; } public static SelectList ToSelectList(this Type enumObj) { return new SelectList(enumObj.FromEnum(), "Key", "Value"); } #endregion
#region Generic List to SelectItem public static SelectList SelectFromList<TItem>(this List<TItem> values, Expression<Func<TItem, string>> key, Expression<Func<TItem, string>> value) { var Key = key.Compile(); var Value = value.Compile(); List<KeyValuePair<string, string>> kvp = new List<KeyValuePair<string, string>>(values.Count); values.ForEach(item => kvp.Add(new KeyValuePair<string, string>(Key.Invoke(item), Value.Invoke(item)))); return new SelectList(kvp, "Key", "Value"); } #endregion
#region paged list control //after http://geekswithblogs.net/nuri/archive/2009/08/05/mvc-paged-list.aspx /// <summary> /// Shows a pager control - Creates a list of links that jump to each page /// </summary> /// <param name="page">The ViewPage instance this method executes on.</param> /// <param name="pagedList">A PagedList instance containing the data for the paged control</param> /// <param name="controllerName">Name of the controller.</param> /// <param name="actionName">Name of the action on the controller.</param> public static void ShowPagerControl(this ViewPage page, BasePagedListImplementation pagedList, string formatUrl) { HtmlTextWriter writer = new HtmlTextWriter(page.Response.Output); if (writer != null) { for (int pageNum = 1; pageNum <= pagedList.PageCount; pageNum++) { bool samepage=(pageNum == pagedList.PageNumber); if (!samepage) { writer.AddAttribute(HtmlTextWriterAttribute.Href,string.Format(formatUrl, pageNum)); writer.AddAttribute(HtmlTextWriterAttribute.Alt, "Page " + pageNum); writer.RenderBeginTag(HtmlTextWriterTag.A); } writer.AddAttribute(HtmlTextWriterAttribute.Class, pageNum == pagedList.PageNumber ? "pageLinkCurrent" : "pageLink"); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.Write(pageNum); writer.RenderEndTag(); if (!samepage) { writer.RenderEndTag(); } writer.Write(" "); } writer.Write("("); writer.Write(pagedList.TotalItemCount); writer.Write(" items in all)"); } } #endregion
Other extensions available that are good :
If you know more, please tell me
Powered by Twitter Tools
you can download the PDF from http://msprogrammer.serviciipeweb.ro/wp-content/uploads/2010/03/tools.pdf
Firefox addons |
https://addons.mozilla.org/en-US/firefox/collection/ignatandrei |
firebug | |
yahoo slow | |
webdeveloper | |
weave | |
morningcofee | |
measureit | |
htmlvalidator | |
faviconizetab | |
exchangebcebnr | |
colorzilla | |
addoncollector | |
googlenotebook | |
downloadstatusbar | |
goolepagespeed |
As I was saying, you can download the PDF from http://msprogrammer.serviciipeweb.ro/wp-content/uploads/2010/03/tools.pdf