- یا از روش مطلب به اشتراک گذاشته شده استفاده کنید. (کلیک روی عنوان ...)
- یا از روشی که خودم استفاده میکنیم هم میتونید استفاده کنید.
public interface IAuthentication { bool IsUserAuthenticated(string userName, string password); } public class AuthenticationService : IAuthentication { public bool IsUserAuthenticated(string userName, string password) { return userName == "Vahid" && password == "123"; } } public class LoginController { private readonly IAuthentication _authentication; public LoginController(IAuthentication authentication) { _authentication = authentication; } // ... }
public class LoginController { private readonly Func<string, string, bool> _authenticationStrategy; public LoginController(Func<string, string, bool> authenticationStrategy) { _authenticationStrategy = authenticationStrategy; } // ... }
namespace jqGrid10.Models { public class Post { public int Id { set; get; } public string Title { set; get; } public string CategoryName { set; get; } public int NumberOfViews { set; get; } } }
$('#list').jqGrid({ caption: "آزمایش دهم", //... grouping: true, groupingView: { groupField: ['CategoryName'], groupOrder: ['asc'], groupText : ['<b>{0} - {1} ردیف</b>'], groupDataSorted: true, groupColumnShow: false, groupCollapse: true, groupSummary: [true], showSummaryOnHide: true } });
colModel: [ // ........ { name: '@(StronglyTyped.PropertyName<Post>(x => x.Title))', index: '@(StronglyTyped.PropertyName<Post>(x => x.Title))', align: 'right', width: 150, summaryTpl: '<div style="text-align: left;">خلاصه </div>', summaryType: function (val, name, record) { return ""; } }, // ........ { name: '@(StronglyTyped.PropertyName<Post>(x => x.NumberOfViews))', index: '@(StronglyTyped.PropertyName<Post>(x => x.NumberOfViews))', align: 'center', width: 70, summaryType: 'sum', summaryTpl: '<b>جمع مشاهدات: {0}</b>' } ],
$('#list').jqGrid({ caption: "آزمایش دهم", //......... loadComplete: function() { //......... $('#list').jqGrid('groupingToggle', 'list' + 'ghead_0_0'); $("tr.jqfoot td").css({ "background": "#2f4f4f", "color": "#FFF" }); }, });
using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.Text; using System.Threading.Tasks; namespace MyNewsWCFLibrary { [ServiceContract] interface IMyNewsService { [OperationContract] List<tblNews> GetAllNews(); [OperationContract] tblNews GetNews(int tblNewsId); [OperationContract] int AddNews(tblNews News); [OperationContract] bool EditNews(tblNews News); [OperationContract] bool DeleteNews(int tblNewsId); [OperationContract] int AddCategory(tblCategory News); [OperationContract] bool DeleteCategory(int tblCategoryId); [OperationContract] List<tblCategory> GetAllCategory(); } }
کلاسی به نام MyNewsService با ارثبری از IMyNewsService ایجاد میشود. زیر حرف I از IMyNewsService یک خط دیده میشود که با کلیک روی آن برابر با شکل زیر عمل کنید:
ملاحظه خواهید کرد که کلیهی متدها برابر با Interface ساخته خواهد شد. اکنون همانند شکل روی نشان هرم شکلی که هنگامی که روی نام کلاس کلیک میکنید، در سمت چپ نشان داده میشود کلیک کنید و گزینه Move to another file to match type name را انتخاب کنید:
به صورت خودکار محتوای این کلاس به یک فایل دیگر انتقال مییابد. اکنون هر کدام از متدها را به شکل دلخواه ویرایش میکنیم. من کد کلاس را اینگونه تغییر دادم:
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; namespace MyNewsWCFLibrary { class MyNewsService : IMyNewsService { private dbMyNewsEntities dbMyNews = new dbMyNewsEntities(); public List<tblNews> GetAllNews() { return dbMyNews.tblNews.Where(p => p.IsDeleted == false).ToList(); } public tblNews GetNews(int tblNewsId) { return dbMyNews.tblNews.FirstOrDefault(p => p.tblNewsId == tblNewsId); } public int AddNews(tblNews News) { dbMyNews.tblNews.Add(News); dbMyNews.SaveChanges(); return News.tblNewsId; } public bool EditNews(tblNews News) { try { dbMyNews.Entry(News).State = EntityState.Modified; dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } } public bool DeleteNews(int tblNewsId) { try { tblNews News = dbMyNews.tblNews.FirstOrDefault(p => p.tblNewsId == tblNewsId); News.IsDeleted = true; dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } } public int AddCategory(tblCategory Category) { dbMyNews.tblCategory.Add(Category); dbMyNews.SaveChanges(); return Category.tblCategoryId; } public bool DeleteCategory(int tblCategoryId) { try { tblCategory Category = dbMyNews.tblCategory.FirstOrDefault(p => p.tblCategoryId == tblCategoryId); Category.IsDeleted = true; dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } } public List<tblCategory> GetAllCategory() { return dbMyNews.tblCategory.Where(p => p.IsDeleted == false).ToList(); } } }
ولی شما ممکن است دربارهی حذف، دوست داشته باشید رکوردها از پایگاه داده حذف شوند و نه اینکه با یک فیلد بولی آنها را مدیریت کنید. در این صورت کد شما میتواند اینگونه نوشته شود:
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; namespace MyNewsWCFLibrary { class MyNewsService : IMyNewsService { private dbMyNewsEntities dbMyNews = new dbMyNewsEntities(); public List<tblNews> GetAllNews() { return dbMyNews.tblNews.ToList(); } public tblNews GetNews(int tblNewsId) { return dbMyNews.tblNews.FirstOrDefault(p => p.tblNewsId == tblNewsId); } public int AddNews(tblNews News) { dbMyNews.tblNews.Add(News); dbMyNews.SaveChanges(); return News.tblNewsId; } public bool EditNews(tblNews News) { try { dbMyNews.Entry(News).State = EntityState.Modified; dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } } public bool DeleteNews(tblNews News) { try { dbMyNews.tblNews.Remove(News); dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } } public int AddCategory(tblCategory Category) { dbMyNews.tblCategory.Add(Category); dbMyNews.SaveChanges(); return Category.tblCategoryId; } public bool DeleteCategory(tblCategory Category) { try { dbMyNews.tblCategory.Remove(Category); dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } } public List<tblCategory> GetAllCategory() { return dbMyNews.tblCategory.ToList(); } } }
البته باید در نظر داشته باشید که در صورت هر گونه تغییر در پارامترهای ورودی، لایهی Interface نیز باید تغییر کند. گونهی دیگر نوشتن متد حذف خبر میتواند به صورت زیر باشد:
public bool DeleteNews(int tblNewsId) { try { tblNews News = dbMyNews.tblNews.FirstOrDefault(p => p.tblNewsId == tblNewsId); dbMyNews.tblNews.Remove(News); dbMyNews.SaveChanges(); return true; } catch (Exception exp) { return false; } }
در بخش 5 دربارهی تغییرات App.Config خواهم نوشت.
protected override void OnCanExecuteBeginEdit(System.Windows.Input.CanExecuteRoutedEventArgs e) { var hasCellValidationError = false; var hasRowValidationError = false; const BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance; //Current cell var cellErrorInfo = this.GetType().BaseType.GetProperty("HasCellValidationError", bindingFlags); //Grid row var rowErrorInfo = this.GetType().BaseType.GetProperty("HasRowValidationError", bindingFlags); if (cellErrorInfo != null) hasCellValidationError = (bool) cellErrorInfo.GetValue(this, null); if (rowErrorInfo != null) hasRowValidationError = (bool) rowErrorInfo.GetValue(this, null); base.OnCanExecuteBeginEdit(e); if ((!e.CanExecute && hasCellValidationError) || (!e.CanExecute && hasRowValidationError)) { e.CanExecute = true; e.Handled = true; } }