Asp.Net MVC4的学习概况

周一正式开始了毕业工作。然后学习调试了近4天,刚刚总算在同事的帮助下做出了一个基于Asp.Net MVC4的Hello World显示。

这是一篇最为基础的记录教程,记录内容可能有点混乱,旨在能在刚调试完成,趁着印象深刻急速记录,晚些会重新做一遍这个项目写一个更为详细的博文。

下面是正文:

整个网站项目由若干个功能子项目组成。而我要做的是自己做一个口香糖demo混在原项目中。所以基础的配置我就先不说了。首先复制别的子项目一份并且重命名为Aibol.Sugar,并且导入visual studio。导入后的项目如下图所示。

然后把多余的文件删除,然后写相应的代码。最后截图如下。

好了,上面就是完成效果,教程结束。

开个玩笑。

下面是核心步骤:

1.创建数据库jiedian.Aibol.Sugar。

注意,ID一定要是uniqueidentifier类型!敲黑板!因为后面是要继承父类进行操作,所以就限定死了ID必须是该类型。

另外一定要有一个Status状态,这个我忘记为什么了,但是一定要加(也有可能是我记错了,我会在下个教程中说明的,应该)

2.在项目的Repositories文件夹中创建SqlServer文件夹和一个ISugarRepository接口。然后在SqlServer中创建SugarRepository和数据库访问模板Sugar.dbml。如下图所示。

为什么是这种格式呢?扔粉笔!很重要啊!如果后期需要实现mysql数据库,那么只要在Repositories文件夹中再创建一个“mysql”文件夹,接口都共用ISugarRepository接口。也就是说用同一套接口实现不同的数据库。

3.Sugar.dbml是这样创建的:新建一个“LINQ to SQL Classes”,即可创建一个空dbml文件。在这里重命名为Sugar.dbml。然后在SQL Server Object Explorer窗口中,把jiedian.Aibol.Sugar数据库直接拖到这个空dbml文件中,就可以成功创建一个非空的dbml文件。

题外话:这个东西到底有什么用我也不是很清楚,反正这么用就对了。表示从Java的SSM框架转到Asp.Net MVC4还是有点水土不服的。

4.然后ISugarRepository.cs的内容改成这样:

namespace Aibol.Modules.Sugars.Repositories
{
    public interface ISugarRepository : IRepositoryBase<Sugars.Models.Sugar>
    {
    }
}

我也不知道为什么,照着写就对了。

5.相对应的SugarRepository.cs改成这样:

namespace Aibol.Modules.Sugars.Repositories.SqlServer
{
    public class SugarRepository : ISugarRepository
    {
        private readonly SugarDataContext _context;

        public SugarRepository(SugarDataContext context)
        {
            _context = context;
        }

        public int Delete(SearchCriteria searchCriteria)
        {
            throw new NotImplementedException();
        }

        public IQueryable<Models.Sugar> GetCollection(SearchCriteria searchCriteria)
        {
            var sugarFilter = FilterSugar(searchCriteria);

            return _context
                .jiedian_Aibol_Sugars
                .Where(sugarFilter)
                .OrderByDescending(r => r.CreatedWhen)
                .Select(t => t.MapToEntity<Models.Sugar>());
        }
        private Expression<Func<jiedian_Aibol_Sugar, bool>> FilterSugar(SearchCriteria sc)
        {
            var predicate = PredicateBuilder.True<jiedian_Aibol_Sugar>();

            if (sc.ContainsKey("name"))
            {
                predicate = predicate.And(t => t.Name.IndexOf(sc["name"], StringComparison.Ordinal) > -1);
            }

            if (sc.ContainsKey("term"))
            {
                var term = sc["term"].Trim();
                predicate = predicate.And(p => p.Name.IndexOf(term) > -1 );
            }

            return predicate;
        }

        //获取实例
        public Models.Sugar GetInstance(Guid id)
        {
            return _context
                .jiedian_Aibol_Sugars
                .Where(t => t.ID == id)
                .Select(t => t.MapToEntity<Models.Sugar>())
                .FirstOrDefault();
        }

        //保存
        public Models.Sugar Save(Models.Sugar item)
        {
            jiedian_Aibol_Sugar aibolSugar = null;
            if(item.ID!=Guid.Empty)
            {
                aibolSugar = _context.jiedian_Aibol_Sugars.FirstOrDefault(t => t.ID == item.ID);
            }
            if (aibolSugar == null)
            {
                item.ID = Guid.NewGuid();
                aibolSugar = new jiedian_Aibol_Sugar();
                _context.jiedian_Aibol_Sugars.InsertOnSubmit(aibolSugar);
            }
            item.MergeToDbModel(aibolSugar);
            _context.SubmitChanges();
            return item;
        }

        //修改
        public int UpdateStatus(SearchCriteria searchCriteria)
        {
            var ids = searchCriteria["ids"].Split(‘,‘).Select(Guid.Parse);
            var list = _context.jiedian_Aibol_Sugars.Where(t => ids.Contains(t.ID)).ToList();
            var count = 0;
            foreach (var item in list)
            {
                switch (searchCriteria.Status)
                {
                    case 4:
                        count++;
                        break;
                    case 8:
                        count++;
                        break;
                }
            }
            _context.SubmitChanges();
            return count;
        }

    }
}

同理,原理不知。

6.Services文件夹下创建service文件,其中包括ISugarService和SugarService。

其中ISugarService文件内容如下:

namespace Aibol.Modules.Sugars.Services
{
    public interface ISugarService : IServiceBase<Models.Sugar>
    {
        object GetInstance(object iD);
    }
}

SugarService文件内容如下:

namespace Aibol.Modules.Sugars.Services
{
    class SugarService:ISugarService
    {
        private readonly ISugarRepository _sugarRepository;
        private readonly IAibolCacheModule _cache;
        private readonly ITenantService _tenantService;

        public SugarService(ISugarRepository sugarRepository, IBackgroundServiceRegistry backgroundService, IAibolCacheModule cache, ITenantService tenantService)
        {
            _sugarRepository = sugarRepository;
            _cache = cache;
            _tenantService = tenantService;
        }

        public Models.Sugar GetInstance(Guid id)
        {
            if (id == Guid.Empty)
                return null;

            var sugar = _cache.GetItem(id.ToString(),
                () =>
                {
                    var s = _sugarRepository.GetInstance(id);

                    return s;
                },
                null);

            return sugar;
        }

        public Models.Sugar Save(Models.Sugar item)
        {
            if (!string.IsNullOrEmpty(item.Name) && string.IsNullOrEmpty(item.SpellChar))
            {
                item.SpellChar = item.Name.GetSpellCode();
            }

            _sugarRepository.Save(item);

            _cache.Invalidate(item.GetCacheItemKey());

            return GetInstance(item.ID);
        }

        public IPageOfItems<Models.Sugar> GetCollection(SearchCriteria searchCriteria)
        {
            var list = _sugarRepository
                .GetCollection(searchCriteria)
                .GetPage(searchCriteria.PageIndex, searchCriteria.PageSize);

            foreach (var item in list)
            {
                FillDependencies(item);
            }

            return list;
        }

        private void FillDependencies(Models.Sugar u)
        {
            if (u.CreatedBy != null)
            {
                u.CreatedBy = u.CreatedBy.ID == u.ID ? u : GetInstance(u.CreatedBy.ID);
            }

            if (u.LastModifiedBy != null)
            {
                u.LastModifiedBy = u.LastModifiedBy.ID == u.ID ? u : GetInstance(u.LastModifiedBy.ID);
            }

            if (u.Tenant != null)
            {
                u.Tenant = _tenantService.GetInstance(u.Tenant.ID);
            }
        }

        public int UpdateStatus(SearchCriteria searchCriteria)
        {
            var count = _sugarRepository.UpdateStatus(searchCriteria);

            return count;
        }

        public int Delete(SearchCriteria searchCriteria)
        {
            throw new NotImplementedException();
        }

        public object GetInstance(object iD)
        {
            throw new NotImplementedException();
        }
    }
}

7.然后创建controller。在Controllers文件夹下创建SugarController,内容如下:

namespace Aibol.Modules.Sugars.Controllers
{
    [Application(Name = "Data.Sugar", DisplayOrder = 10)]

    public class SugarController:AibolController
    {

        //私有变量
        private readonly IBackgroundServiceRegistry _backgroundServiceRegistry;
        private readonly ISugarService _sugarService;

        public SugarController(IValidationService validationService,
            AibolContext context,
            ISerializationService serializationService, IBackgroundServiceRegistry backgroundServiceRegistry, ISugarService sugarService)
            : base(validationService, context, serializationService)
        {
            _backgroundServiceRegistry = backgroundServiceRegistry;
            _sugarService = sugarService;
        }

        public SugarController(IValidationService validationService,
            AibolContext context,
            ISerializationService serializationService,
            ILogService logService,
            ILocalizationService localizationService, IBackgroundServiceRegistry backgroundServiceRegistry, ISugarService sugarService)
            : base(validationService, context, serializationService, logService, localizationService)
        {
            _backgroundServiceRegistry = backgroundServiceRegistry;
            _sugarService = sugarService;
        }

        internal object list(object p)
        {
            throw new NotImplementedException();
        }

        [HttpGet]
        [AllowAnonymous]
        [ActionName("Sugars")]
        public object SugarIndex()
        {
            var model = new AibolViewModel
            {
                Container = new SugarsContainer()
            };
            return model;
        }
    }
}

除了路由那部分,其它内容都很迷,我表示看不大懂,好像是在注册一些东西?说到注册,请看8。

8.在项目根目录下创建SugarModule.cs,继续敲黑板!在这里坑了很久,必须要注册service和repository!

namespace Aibol.Modules.Sugars
{
    class SugarModule: IAibolModule, IAibolDataProvider
    {
        private readonly IUnityContainer _container;

        public SugarModule(IUnityContainer container)
        {
            _container = container;
        }

        //fixed
        public void Initialize()
        {
        }

        //fixed
        public void Unload()
        {
        }

        //fixed
        public void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute(
                "Sugars",//路由名称
                "sugars",//带有参数的url
                new {Controller="Sugar",action="Sugars"},//指定控制器以及默认参数值
                null
                );
        }

        //fixed
        public void RegisterCatchAllRoutes(RouteCollection routes)
        {
        }

        //sth problems
        public void RegisterFilters(IFilterRegistry filterRegistry)
        {
            filterRegistry.Add(Enumerable.Empty<IFilterCriteria>(),typeof(SugarActionFilter));
            var contentItemsInputCriteria=new ControllerActionFilterCriteria();
            contentItemsInputCriteria.AddMethod<SugarController>(p=>p.list(null));
            filterRegistry.Add(new[] {contentItemsInputCriteria},typeof(GridActionFilter));
        }

        //fixed
        public void RegisterModelBinders(ModelBinderDictionary modelBinders)
        {
        }

        public void RegisterWithContainer()
        {
            //在这里注册Service
            _container
                .RegisterType<ISugarService, SugarService>();
        }

        public void ConfigureProvider(AibolConfigurationSection config, AibolDataProviderConfigurationElement dataProviderConfig,
            IUnityContainer container)
        {

            var connStr = !string.IsNullOrEmpty(dataProviderConfig.ConnectionString)
                              ? dataProviderConfig.ConnectionString
                              : config.Providers.DefaultConnectionString;

            var connParam=new ResolvedParameter<string>(connStr);
            if (dataProviderConfig.Category == "LinqToSql")
            {
                //在这里注册Repository
                container.RegisterType<SugarDataContext>(new TransientLifetimeManager(),
                    new InjectionConstructor(connParam)).RegisterType<ISugarRepository, SugarRepository>();

            }
        }

    }
}

9.在主项目目录Views下创建Sugar文件夹,在里面创建前端展示页面Sugars.cshtml。

10.在主项目config里分别在各个节点加入如下代码:

在dataProviders中加入如下内容:

<add name="Sugars" type="Aibol.Modules.Sugars.SugarModule, Aibol.Sugars" category="LinqToSql" />

在modules中加入如下内容:

<add name="Sugars" type="Aibol.Modules.Sugars.SugarModule, Aibol.Sugars" dataProvider="Sugars" />

11.运行项目,跑一把,下面是浏览截图。- -;

花了四天总算把一个Hello口香糖写出来。很感谢我同事啊,不厌其烦的教我??感觉自己蠢爆天??

一些相关的小知识:

Alt+Enter可以直接进行代码整理和提示。

在coding.net可以注册git账号然后同步项目代码。

在类名或者方法上按F12可以跳转到该类或者该方法的定义位置。

调试过程中,F10是该代码页面依次执行(不会进入方法进行细分调试)。F11是依次执行每一行代码(如果遇到方法,会进入该方法逐步调试)

Debug->Windows->Threads,可以在调试中对线程进行锁定等操作。

如果发现项目无法调试,很可能你的调试模式调成了Release,把它调整为Debug就可以了。

时间: 2024-10-18 12:05:57

Asp.Net MVC4的学习概况的相关文章

ASP.NET MVC4中IOC应用的学习

Asp.net MVC也接触好久了,但由于自己一直主要负责后台,尤其是数据库方面的工作对于该框架并没有一个很好的了解,尤其是蒋金楠大师的ASP.NET MVC4框架剖析一书都买了2年多了,真正认真看过并实践过的也就第一章而已.最开始的时候还老认为这本书不好,又厚又晦涩,不容易坚持读完,现在回想起来都觉得羞愧.标准的徒弟不好怪师傅的心态,当然学习的确需要一个过程,从浅入深会越来越喜欢.到目前为止,我最喜欢的书籍系列依然是入门经典系列,内容简单有习题,方便记忆与实践.最近有一段学习JAVA的过程,让

asp.net mvc4 学习1

1 简介:微软在很早就看到了基于windows系统的web开发平台的需求,这时便开始提出自己的解决方案即微软的第一个基于web开发的平台ASP.再后来随着需求和性能的要求再2002年推出第二个解决方案ASP.NET来满足.但是技术不断地在改进很快又有了新的需求,不再基于页面在2008年推出了asp.net mvc的开发模式(模型-视图-控制器),看来五六年技术会得到一次飞跃,当然这只是猜测而已. mvc模式把应用程序分成三层,而且这三层之间的关系是松耦合即相互隔离,互不影响,而这种情况确实最好的

ASP.NET MVC4 学习系统一(项目模板)

项目模板 1.空模板      空模板用于创建ASP.NETMVC 4网站的架构,包含基本的文件夹结构,以及需要引用的asp.netmvc程序集,也包含可能要使用的javaScript 库.模板同样包含默认的视图布局,以及标准配置代码的Global.asax文件.绝大部分asp.net mvc应用程序都会用到家些代码.2.基本模板      基本模板按照asp.net mvc4的规则创建了文件结构,包含asp.netmvc程序集的引用.这些模板表明了创建asp.netmvc4  项目需要的最低标

ASP.NET MVC4入门到精通系列目录汇总(转)

序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,Web开发依旧停留在拖控件的水平,最最基本的算 法,递归.排序(我不要求快速排序,你会冒泡就行了)都不会,数据库方面,很基础的SQL都写不出,分组过滤也不会,更别提性能了,问下数据优化经验,除 了回答加索引基本就没下文了.当然,一些过去N年都是做ASP.NET WebForm开发的,不熟悉MVC,那也没

使用bootstrap+asp.net mvc4+IBatis.Net实现的小程序

这个项目用到了三个技术点 1.bootstap 3.0 2.asp.net mvc4 3.IBatis.Net 这个三个技术点分别解决前端界面展示.中间mvc路由控制.实体框架映射数据访问 重点分页问题花了点时间. 代码发布在GitHub上给感兴趣的人下载来学习 https://github.com/zuifengke/ChuanQI 来自为知笔记(Wiz)

[MVC4]初识ASP.NET MVC4

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

Asp.Net MVC4开发一:概要

之前为写Asp.Net MVC4而写了Linq应用系列: Linq技术一:Linq to SQL和Devart Linq to SQL Model Linq技术二:Linq to XML及xml增删改查的不同实现方式 Linq技术三:Linq to Object 和生成数据表的扩展方法 Linq技术四:动态Linq技术 -- Linq.Expressions 现在开始写Asp.Net MVC4的系列应用, 主要方面包括: 1. Entity Framework在Asp.Net MVC4中的应用.

微信开发订阅号(ASP.NET MVC4+jquery mobile+AppHarbor发布)

首先应该去微信公众平台注册一个账号,因为我是用的个人,所以只能注册订阅号,然后需要提供身份证照片,这些大家慢慢折腾.然后在微信管理面板中选择高级功能,进入开发者模式. 在服务器配置中需要提供最重要的url,用来接收微信发过来的消息和回复消息,token这个随便填一个就行了,主要是用来验证消息来源. 如果你是java php开发者,那么你可以选google AppEngin 或者sina app engine 来部署你的应用,但是很不幸,我是.net,这里我们使用国外的AppHarbor,appH

Asp.Net MVC4入门指南(1): 入门介绍

前言 本教程将为您讲解使用微软的Visual Studio Express 2012或Visual Web Developer 2010 Express Service Pack 1 来建立一个ASP.NET MVC4 Web应用程序所需要的基础知识.建议您使用Visual Studio 2012,你将不再需要安装任何组件,来完成此教程.如果您使用的是Visual Studio 2010,您必须安装下面的组件.您可以通过点击下面的链接,来安装所需的所有组件: Visual Studio Web