ZOO-BLOG WEB应用程序
ASP Net.Core MVC Web应用使用MSSQL EF6身份和Boostrap
主目录页面,您可以在其中滚动并选择Animel探索和评论

关于
此ASP.NETCORE Web应用程序使用一个布局视图演示了MVC模式,其中包含带有不同视图和控制器的NAV栏和渲染器主体。我加入了一个视图组件,以使Animels探索Divs在页面之间更为常见,并使用Boostrap Libary进行样式
模型(实体框架核心)
MSSQL图

我的模型包含3个对象:类别,动物和评论。我给了他们的每一个预言和拟合验证属性在内
- 验证动物的生日少于150年,目前出生
- 文件验证器以检查文件的内容类型是否包含“图像”一词,并且文件的大小限制为10MB
| 公共类ImageFileValidationAttribute :验证attribute |
| { |
| const int max_file_size = 10 * 1024 * 1024 ; // 10MB |
| 受保护的验证验证? iSvalid ( object ? value , validationContext验证context ) |
| { |
| if ( value是iformfile文件!=默认值) |
| { |
| if (文件。长度> max_file_size ) |
| 返回新的验证重点( “此文件的大小大于10MB限制” ) ; |
| if ( file。contentType 。包含( “ image ” ) ) |
| 返回验证。成功; |
| 返回新的验证result ( “这不是有效的文件” ) ; |
| } |
| 返回新的验证result ( “请输入有效的映像文件” ) ; |
| } |
| } |
为了生成类别,我制作了一个枚举助手模型,该模型未映射到数据库,但我用来生成适当的选择标签
该模型项目还包含每个ID的数据访问层通用基础存储套件类别的ID属于类型GUID和一项图像形式的服务,这有助于我将图像文件保存为字节阵列,并将映像重新生成客户端端
| 公共静态字节[ ] formFiletobyTearray ( FormFile formFile ) |
| { |
| 如果( formFile != null ) |
| { |
| memoryStream MemoryStream = new MemoryStream ( ) ; |
| formfile 。 OpenReadStream ( ) 。 copyto ( memorystream ) ; |
| byte [ ] rawdata = memorystream 。 toarray ( ) ; |
| 返回rawdata ; |
| } |
| 返回默认值; |
| } |
| 公共静态字符串格式图(字节[ ] imagesfiledata ) |
| { |
| 如果( imagesFileData != null ) |
| 返回“数据:图像; base64”, +转换。 tobase64String ( ImagesFileData ) ; |
| 返回默认值; |
| } |
| |
| } |
看法
我为控制器创建了几个视图,一个视图组件和3个有用的部分视图,用于布局样式和脚本和NAV BAR。NAV栏用于在不同的视图和操作之间导航
应用程序的导航栏

创建和更新的管理器视图包含文件类型的Vannila JS验证和大小,以防止浏览器丢弃错误
| fileInput 。 AddEventListener ( “ change” , function ( ) { |
| 让Filesize =此。文件[ 0 ] 。尺寸; |
| if ( this。files [ 0 ] ===未定义|| filesize === undefined ) { |
| 这。 setCustomVality ( “请输入文件” ) ; |
| 这。 reportVality ( ) ; |
| 返回; |
| } |
| 如果( Filesize > MaxFilesize ) { |
| 这。 setCustomVality ( “此文件大于10MB” ) ; |
| 这。值= “” ; |
| 这。 reportVality ( ) ; |
| 返回; |
| } |
| 如果( ! |
| 这。 setCustomVality ( “这不是映像文件” ) ; |
| 这。值= “” ; |
| 这。 reportVality ( ) ; |
| 返回; |
| } |
| 如果( Filesize < maxfilesize ) { |
| 这。 setCustomVality ( “” ) ; |
| 这。 reportVality ( ) ; |
| } |
| } ) ; |
控制器
该项目包含4个控制器:
- 家 - 展示两个评论最多的动物
- 经理 - 处理动物数据的CRUD操作
- 目录 - 查看博客中的动物,可以按类别进行排序
- 动画数据 - 探索动物的详细信息,并允许用户发表评论。评论发布使用fetch API,以防止每次用户发表评论时页面重新加载。
| 异步函数addComment ( event ) { |
| 让评论= { |
| 评论:未定义, |
| 内容: ContentTextarea 。价值, |
| 动画: id , |
| } |
| 评论= JSON 。 stringify (注释) ; |
| 等待提取( ` $ { baseurl } /index` , { |
| 方法: “帖子” , |
| 身体:评论, |
| 标题: { |
| “ content-type” : “ application/json” |
| } |
| } ) 。然后( ( ) => { getAllComments ( ) ; } ) ; |
| } |
你好世界评论

身份验证&&授权(身份)
我使用Identity Nuget和单独的上下文,以便在我的Web应用程序中对用户进行身份验证和授权用户在应用程序中名为LoginModel和IngiupModel在Handels中注册和弹跳。管理器角色可以使用管理器控制器,并具有锚定NAV-LINK来创建和更新。每个签名的用户都可以评论应用程序中的动物(包括经理)。匿名用户只能滚动浏览Animels目录页面或注册/登录。
注册行动:
| [ httppost ] |
| [ varateantiforgerytoken ] |
| public sync任务<IrinctionResult> register ( IngiupModel用户) |
| { |
| if ( ModelState。iSvalid ) |
| { |
| Identityuser iduser =新的sidentityuser |
| { |
| 用户名=用户。用户名, |
| Phonenumber =用户。 Phonenumber , |
| 电子邮件=用户。电子邮件 |
| } ; |
| var createrult =等待_usermanager 。 createAsync ( iduser ,用户。密码) ; |
| var addrole =等待_usermanager 。 addtoroleasync ( iduser , “用户” ) ; |
| 如果( Createrult。Susported ) |
| { |
| var Ingresult =等待_signInManager 。 passwordSignInAsync (用户。用户名,用户。密码, false , false ) ; |
| if (签名成功) |
| { |
| 返回redirecttoaction ( “索引” , “ home” ) ; |
| } |
| 返回登录( ) ; |
| } |
| } |
| 返回视图( ) ; |
| } |
单位测试
此Web应用程序解决方案包括一个Xunit项目,用于用于检查和验证reposiroeybase类的同步和异步方法的reposiroeybase类。
测试示例:
| [测试,需求] |
| public void findbyidasync ( ) |
| { |
| _categoryrepository ? 。创建(类别测验! ) ; |
| _animelrepository ? 。创建( animeltest ! ) ; |
| _CommentRepository ? 。创建(评论测试! ) ; |
| |
| 任务<Animal> animelfound = _animelrepository ! 。 findbyidasync ( animeltest ! 。id ) ; |
| 动画。继续( _ = > { assert 。 |
| 任务<Animal> AnimelNotFound = _animelrepository 。 findbyidasync ( do_not_insret_animel ! 。id ) ; |
| AnimelNotFound 。继续( _ = > { assert 。 |
| 任务<Comment> commentfound = _commentRepository ! 。 FindbyIdAsync ( rymenttest !。 |
| 评论发现。继续( _ = > { assert 。 |
| 任务<Category> categoryfound = _categoryrepository ! 。 findbyidAsync ( categoryTest ! 。categoryId ) ; |
| 类别发现。继续WASWITH ( _ = > { assert 。 |
| } |