рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП ASP.Net MVC 3 рдкрд░ рдЕрдЬрд╛рдХреНрд╕рдЧреНрд░рд┐рдб рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рд▓реЗрдЦ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рд╕рдВрдкрд╛рджрди, рдЕрдЬрд╛рдХреНрд╕ рдЫрдБрдЯрд╛рдИ рдФрд░ рдЕрдЬрд╛рдХреНрд╕ рдкреЗрдЬрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рд░рдгреАрдмрджреНрдз рд░реВрдк рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрдИ рдЙрдкрд▓рдмреНрдз рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдкрд░рд┐рдЪрд╛рд▓рди рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рд░рдгреАрдмрджреНрдз рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдкрд╕рдВрдж рд╣реИ:

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, AjaxGridScaffolder рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
PM> Install-Package AjaxGridScaffolder
рдПрдХ рдбреЗрдЯрд╛ рд▓реЗрдпрд░ рдмрдирд╛рдПрдВ
рд╕рд╛рд░ред
namespace HabrahabrMVC.Domain.Entities { public class RealtyObject { public int Id { get; set; } public string City { get; set; } public string Street { get; set; } public string House { get; set; } public double Cost { get; set; } public bool Visible { get; set; } } }
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред
namespace HabrahabrMVC.Domain.Abstract { public interface IRepository { IQueryable<RealtyObject> GetAll(); void Save(RealtyObject objectToSave); } }
рдкреНрд░рд╕рдВрдЧред
namespace HabrahabrMVC.Domain.Concrete { public class EFContext : DbContext { public DbSet<RealtyObject> RealtyObjects { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } } }
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
namespace HabrahabrMVC.Domain.Concrete { public class EFRepository :IRepository { EFContext _db = new EFContext(); public void Save(Entities.RealtyObject objectToSave) { _db.Entry(_db.RealtyObjects.SingleOrDefault(z=>z.Id==objectToSave.Id)).CurrentValues.SetValues(objectToSave); _db.Entry<RealtyObject>(_db.RealtyObjects.SingleOrDefault(z => z.Id == objectToSave.Id)).State = System.Data.EntityState.Modified; _db.SaveChanges(); } public IQueryable<RealtyObject> GetAll() { return _db.RealtyObjects.AsQueryable(); } } }
рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдБ
ObjectsView:

1) рдЗрд╕рдХреЗ рд▓рд┐рдП, рдХрдВрдЯреНрд░реЛрд▓рд░ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдореЗрдВ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, Add-> рдХрдВрдЯреНрд░реЛрд▓рд░ ... (Add-> рдХрдВрдЯреНрд░реЛрд▓рд░ ...) рдЪреБрдиреЗрдВред
2) рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░реЛрд▓ рдирд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред
3) рдЯреЗрдореНрдкрд▓реЗрдЯ - рдЕрдЬрд╛рдХреНрд╕ рдЧреНрд░рд┐рдб рдирд┐рдпрдВрддреНрд░рдХ
4) рдореЙрдбрд▓ рд╡рд░реНрдЧ - RealtyObject (HabraHabrMVC3.Domain.Entities)
5) рдбреЗрдЯрд╛ рд╕рдВрджрд░реНрдн рд╡рд░реНрдЧ - EFContext (HabraHabrMVC3.Domain.Concrete)
6) рдЬреЛрдбрд╝реЗрдВред
рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдирд┐рдиреНрдпреВрдЬ рд╣рдорд╛рд░реА рдбреЗрдЯрд╛ рд▓реЗрдпрд░ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗред
рдЕрдм рд╣рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
db.RealtyObjects рдкрд░ db.GetAll ()
db.RealtyObjects.Find (id) рдкрд░ db.GetAll ()ред SingleOrDefault (z => z.Id == id)
рдЕрдм рдореБрдЭреЗ рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ, рд╕рдВрдкрд╛рджрди рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреВрдВрдЧрд╛ред
рдпрд╣ рднреА рджреЗрдЦреЗрдВ рдХрд┐ GridData.cshtml рдиреЗ рдПрдбрд┐рдЯ рдФрд░ рдбрд┐рд▓реАрдЯ рдмрдЯрди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред
рдЕрдм рд▓рд╛рдЗрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ:
ObjectQuery<RealtyObject> realtyobjects = (db as IObjectContextAdapter).ObjectContext.CreateObjectSet<RealtyObject>();
рдХреНрдпреЛрдВрдХрд┐ db IObjectContextAdapter рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо Linq рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреЗрдЯрд┐рдХ рдХреНрд▓рд╛рд╕ рдСрд░реНрдбрд░рдмреЗрд▓рдкрд░ рдмрдирд╛рдпрд╛ред
namespace HabraHabrMVC3.Infrastructure { public static class OrderByHelper { public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string orderBy) { return enumerable.AsQueryable().OrderBy(orderBy).AsEnumerable(); } public static IQueryable<T> OrderBy<T>(this IQueryable<T> collection, string orderBy) { foreach (OrderByInfo orderByInfo in ParseOrderBy(orderBy)) collection = ApplyOrderBy<T>(collection, orderByInfo); return collection; } private static IQueryable<T> ApplyOrderBy<T>(IQueryable<T> collection, OrderByInfo orderByInfo) { string[] props = orderByInfo.PropertyName.Split('.'); Type type = typeof(T); ParameterExpression arg = Expression.Parameter(type, "x"); Expression expr = arg; foreach (string prop in props) {
рдФрд░ рдлрд┐рд░ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЧреНрд░рд┐рдбрдбрд╛рдЯрд╛:
public ActionResult GridData(int start = 0, int itemsPerPage = 20, string orderBy = "Id", bool desc = false) { Response.AppendHeader("X-Total-Row-Count", db.GetAll().Count().ToString()); var realtyobjects = db.GetAll().OrderBy(orderBy + (desc ? " desc" : "")); return PartialView(realtyobjects.Skip(start).Take(itemsPerPage)); }
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдкреЗрдЬрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЕрдЬрд╛рдХреНрд╕ рдЯреЗрдмрд▓ рд╣реИред
рдЗрдирд▓рд╛рдЗрди рд╕рдВрдкрд╛рджрди рдЬреЛрдбрд╝рдирд╛
рдХреЗрд╡рд▓ HTML рд╕рд╣рд╛рдпрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
namespace System.Web { public static class HtmlPrefixScopeExtensions { private const string idsToReuseKey = "__htmlPrefixScopeExtensions_IdsToReuse_"; public static IDisposable BeginCollectionItem(this HtmlHelper html, string collectionName) { var idsToReuse = GetIdsToReuse(html.ViewContext.HttpContext, collectionName); string itemIndex = idsToReuse.Count > 0 ? idsToReuse.Dequeue() : Guid.NewGuid().ToString();
рдмрджрд▓реЗрдВ рдЧреНрд░рд┐рдб рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВ
@model IEnumerable<HabraHabrMVC3.Domain.Entities.RealtyObject> @if (Model.Count() > 0) { foreach (var item in Model) { <text>@Html.Partial("Edit", item)</text> } }
рдФрд░ рджреЗрдЦреЗрдВ рдкрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
@model HabraHabrMVC3.Domain.Entities.RealtyObject @using (Html.BeginCollectionItem("objects")) { <tr> <td> @Html.EditorFor(model => model.City) @Html.ValidationMessageFor(model => model.City) </td> <td> @Html.EditorFor(model => model.Street) @Html.ValidationMessageFor(model => model.Street) </td> <td> @Html.EditorFor(model => model.House) @Html.ValidationMessageFor(model => model.House) </td> <td> @Html.EditorFor(model => model.Cost) @Html.ValidationMessageFor(model => model.Cost) </td> <td> @Html.EditorFor(model => model.Visible) @Html.ValidationMessageFor(model => model.Visible) </td> </tr> }
рджреГрд╢реНрдп рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ, рдЬреЛрдбрд╝реЗрдВ:
@using (Html.BeginForm("Save", "ObjectsView", FormMethod.Post)) { <table id="AjaxGrid"> ...code... </table> <input type="submit" id="save" value="" /> }
рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗрдВ рд╕рд╣реЗрдЬреЗрдВ:
[HttpPost] public ActionResult Save(ICollection<RealtyObject> objects) { foreach(var item in objects) { db.Save(item); } return RedirectToAction("Index"); }
рдпрд╣рд╛рдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ @use (Html.BeginCollectionItem ("
рдСрдмреНрдЬреЗрдХреНрдЯ ")) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдирд╛рдо рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕рд╣реЗрдЬреЗрдВ (ICollection
рдСрдмреНрдЬреЗрдХреНрдЯ ) рд╡рд┐рдзрд┐ рдорд┐рд▓рд╛рди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдоред
рдпрд╣реА рд╣реИ, рдпрд╣ рдЗрдирд▓рд╛рдЗрди рдПрдбрд┐рдЯрд┐рдВрдЧ, рдЕрдЬрд╛рдХреНрд╕ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдЕрдЬрд╛рдХреНрд╕ рдкреЗрдЬрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рд░рдгреАрдмрджреНрдз рд░реВрдк рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ред
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рд╣рд┐рддреНрдп рдХреА рд╕реВрдЪреА:
1)
рдЕрдЬрд╛рдХреНрд╕ рдЧреНрд░рд┐рдб рд╕реНрдХреИрдлрд╝реЛрд▓реНрдбрд░2)
рдПрдХ рдЪрд░ рд▓рдВрдмрд╛рдИ рд╕реВрдЪреА рдХрд╛ рд╕рдВрдкрд╛рджрди, ASP.NET MVC 2-рд╢реИрд▓реА3)
рдЧрддрд┐рд╢реАрд▓ рдПрд╕рдХреНрдпреВрдПрд▓-рдЬреИрд╕реЗ рд▓рд╛рдЗрдирдХ рдСрд░реНрдбрд░рдмрд╛рдп рдПрдХреНрд╕рдЯреЗрдВрд╢рдирд░рд┐рдЬрд▓реНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред