MVC是微软2009对外公布的第一个开源的表示层框架,这是微软的第一个开源项目

M:viewmodel  V:视图  c:控制器

App_Data:一个比较特殊的文件夹,把文件放到这个文件夹,通过地址访问是访问不到的,ASP.NET会帮我们屏蔽掉。通常放一些数据库文件、xml配置文件以防止数据泄露

Content:一般放CSS样式、样式图片

Controllers:放控制器文件

Models:放ViewsModels

Scripts:放js、JQ

Views:放视图的文件夹

Global.asax:全局应用程序

RouteConfig:路由的配置

伪静态:

            routes.MapRoute(
"Default2",
"{controller}-{action}.html",//记得在IIS添加映射 处理成映射--添加托管处理程序 *.html/System.Web.UI.PageHandlerFactory/name
new { controller = "Home", action = "Index"}
);

传值:通过viewData传值

控制器:

        /// <summary>
/// 得到实体
/// </summary>
/// <param name="Account">账号</param>
/// <param name="password">密码</param>
/// <returns></returns>
public MTManagementTools.Model.ToolMember GetModel(string Account, string password)
{ StringBuilder strSql = new StringBuilder();
strSql.Append("select top 1 ID,Account,PassWord,MenuIDs,Name,Sex,Phone,Address,QQ,IsDel from MtToolMember ");
strSql.Append(" where Account=@Account and PassWord=@PassWord and IsDel=0");
SqlParameter[] parameters = {
new SqlParameter("@Account", Account),
new SqlParameter("@PassWord", password)
}; MTManagementTools.Model.ToolMember model = new MTManagementTools.Model.ToolMember();
DataSet ds = DbHelperSQL.Query(strSql.ToString(), parameters);
if (ds.Tables[].Rows.Count > )
{
return DataRowToModel(ds.Tables[].Rows[]);
}
else
{
return null;
}
}

前台视图:

视图传给控制器

控制器:

1、控制器参数的名字和前台name的名字对应上,就会自动识别

2、控制器参数如果是对象,对象属性的和name对应上,也会自动识别

前台传递

当一个控制器有两个同名方法的时候  在方法上一行加上标记用来区分[httpGet]  [HttpPost]

Shared文件,所有的控制器都可以使用的文件夹,母版页就放在这 文件内

传值有好几种方式  viewbag viewdata  tempdate  model

同ViewData和ViewBag一样,TempData也可以用来向视图传递数据。只是ViewData和ViewBag的生命周期和View相同,只对当前View有用。而TempData则可以在不同的Action中进行传值,类似webform里的Seesion。
TempData["abc"] = "this is tempdata";
<p>@TempData["abc"]</p>

跳转

return RedirectToAction("action","controller")
return RedirectToAction("action","controller",RouteValue) 比如:
return RedirectToAction("Index","Home")
return RedirectToAction("Index","Home",new {参数1=xx,参数2=xxx})

11、区分post get请求

在控制器上加标签[HttpPost] (只能接收psot请求)  或者 [get]

12、MVC自带的校验

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc; namespace Monitor_Web.Models.AccountManager
{
public class AddUserViewModel
{
[Required(ErrorMessage = "必填字段")]
[Display(Name = "用户名")]
[MaxLength(, ErrorMessage = "用户名长度最大为{0}个字符")]
//[Remote("CheckUserNameServer", "Account", ErrorMessage = "用户名已存在")]
public string UserName { get; set; } [Required(ErrorMessage = "必填字段")]
[Display(Name = "密码")]
public string UserPwd { get; set; } [Required(ErrorMessage = "必填字段")]
[System.ComponentModel.DataAnnotations.Compare("UserPwd", ErrorMessage = "密码不一致")]
[Display(Name = "确认密码")]
public string ConfirmPwd { get; set; } [Required(ErrorMessage = "必填字段")]
[MaxLength(, ErrorMessage = "全名长度最大为{0}个字符")]
[Display(Name = "全名")]
public string FullName { get; set; } [Required(ErrorMessage = "必填字段")]
[RegularExpression(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "请输入正确的电子邮箱地址!")]
[Display(Name = "邮箱")]
public string MailBox { get; set; } [Display(Name = "管理域")]
public string DomainIds { get; set; } [Display(Name = "角色")]
public long RoleId { get; set; } [Display(Name = "状态")]
public bool Status { get; set; } [Display(Name = "是否能删除")]
public bool CanDelete { get; set; }
}
}

13、html.beginform    自带的ajax表单 beiginajaxfrom

14、母版页

@RenderBody()  :只能添加一个此方法,如果还想多挖几个坑,用下面的方法

@RenderSection("Name")、@RenderSection("Name",false) 第二个参数是指这个坑是否必填,默认true 必填

15、DB.UserInfo. 点不出where

没有引用entity的dll 而且dal和model的版本dll一定要一直,版本不一致解决起来非常麻烦,建议删除重建

NuGet 配置文件信息packages.config

16、在MVC的controller中不能直接跳转,控制器必须有一个返回结果(进行基类验证的时候,正常控制器中可以)

//  filterContext.HttpContext.Response.Redirect("/Login/Index");
filterContext.Result = Redirect("/Login/Index");//注意.
using CZBK.ItcastOA.IBLL;
using CZBK.ItcastOA.Model;
using Spring.Context;
using Spring.Context.Support;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace CZBK.ItcastOA.WebApp.Controllers
{
public class BaseController : Controller
{ public UserInfo LoginUser { get; set; }
/// <summary>
/// 执行控制器中的方法之前先执行该方法。
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
//if (Session["userInfo"] == null)
bool isSucess = false;
if(Request.Cookies["sessionId"]!=null)
{
string sessionId = Request.Cookies["sessionId"].Value;
//根据该值查Memcache.
object obj=Common.MemcacheHelper.Get(sessionId);
if(obj!=null)
{
UserInfo userInfo = Common.SerializeHelper.DeserializeToObject<UserInfo>(obj.ToString());
LoginUser = userInfo;
isSucess = true;
Common.MemcacheHelper.Set(sessionId, obj, DateTime.Now.AddMinutes());//模拟出滑动过期时间.
//留一个后门,测试方便。发布的时候一定要删除该代码。
if (LoginUser.UName == "itcast")
{
return;
}
//完成权限校验。
//获取用户请求的URL地址.
string url = Request.Url.AbsolutePath.ToLower();
//获取请求的方式.
string httpMehotd = Request.HttpMethod;
//根据获取的URL地址与请求的方式查询权限表。
IApplicationContext ctx = ContextRegistry.GetContext();
IBLL.IActionInfoService ActionInfoService = (IBLL.IActionInfoService)ctx.GetObject("ActionInfoService");
var actionInfo= ActionInfoService.LoadEntities(a=>a.Url==url&&a.HttpMethod==httpMehotd).FirstOrDefault();
if (actionInfo != null)
{
filterContext.Result = Redirect("/Error.html");
return;
} //判断用户是否具有所访问的地址对应的权限
IUserInfoService UserInfoService = (IUserInfoService)ctx.GetObject("UserInfoService");
var loginUserInfo = UserInfoService.LoadEntities(u=>u.ID==LoginUser.ID).FirstOrDefault();
//1:可以先按照用户权限这条线进行过滤。
var isExt =(from a in loginUserInfo.R_UserInfo_ActionInfo
where a.ActionInfoID == actionInfo.ID
select a).FirstOrDefault();
if (isExt != null)
{
if (isExt.IsPass)
{
return;
}
else
{
filterContext.Result = Redirect("/Error.html");
return;
} }
//2:按照用户角色权限这条线进行过滤。
var loginUserRole = loginUserInfo.RoleInfo;
var count = (from r in loginUserRole
from a in r.ActionInfo
where a.ID == actionInfo.ID
select a).Count();
if (count < )
{
filterContext.Result = Redirect("/Error.html");
return;
} } }
if (!isSucess)
{
// filterContext.HttpContext.Response.Redirect("/Login/Index");
filterContext.Result = Redirect("/Login/Index");//注意.
}
}
}
}

17、controller调用两次

不知道为什么 引用路径写错了 就会调用两次controller
导致报错,空值,找不到对象等
错误:

@Styles.Render("ueditorcss")
@Scripts.Render("~/bundles/ueditorjs")

正确:

@Styles.Render("~/bundles/ueditorcss")
@Scripts.Render("~/bundles/ueditorjs")

网上说如果有img元素,并且元素的src值是 ""或者# 也会调用两次,(我没发现)

MVC区域 如果在区域中调用/跳转非区域的控制器

如果是在根目录下area就写空

如果是在区域下area就写对应的area名字

<a href="@Url.Action("Detail", "../Article", new { id = item.ID })" target="_blank">阅读全文</a>
<li><a  href="@Url.Action("Index","Home", new {area="" })"><span>首页</span></a></li>
<li><a href="@Url.Action("Index", "Goods", new {area="areaname" })"><span>其他信息</span></a></li>

csrf

  • 在cshtml页面的form标签里加上@Html.AntiForgeryToken()
  • 在Controller需要防范CSRF的Action上加上[ValidateAntiForgeryToken]注解

.net MVC简介、项目中每个文件夹的功能的更多相关文章

  1. 对Android项目中的文件夹进行解释

    对Android项目中的文件夹进行解释: · src:里面存放的是Activity程序,或者是以后的其他组件,在此文件夹之中建立类的时候一定要注意,包名称不能是一级. · gen:此文件夹中的内容是自 ...

  2. android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

    简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件. 1.下载工具 xstr ...

  3. Android中项目中各个文件夹的含义和用途详解

    1.src:存放所有的*.java源程序. 2.gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3.assets:可以存放项目一些较大的资源文件,例如:图片. ...

  4. 【Android】项目中每个文件夹的作用

    1. src:存放所有的*.java源程序. 2. gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. 3. assets:可以存放项目一些较大的资源文件,例如: ...

  5. Eclipse 中 Java 项目中 .settings 文件夹作用

    今天工作时,因对 .settings 文件夹误操作,耗时 6 个多小时,才了解到原因就出在 .settings 文件夹.经查阅资料,对 .settings 做如下整理: 就如setting这个名字,就 ...

  6. vue 项目中assets文件夹与static文件夹引用的区别

    首先,assets文件夹和static文件夹在vue-cli生成的项目中,都是用来存放静态资源的. 1.assets目录中的文件会被webpack处理解析为模块依赖,只支持相对路径形式.build的时 ...

  7. IDEA将Maven项目中指定文件夹下的xml等文件编译进classes

    eclipse下面创建的Maven项目,使用mybatis.eclipse里面能正常启动,在idea中一直卡在maybatis 加载位置. 1.首先是不报错也没反应.这个时候需要我们重写SqlSess ...

  8. JavaWeb项目中各个文件夹的作用

    /WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/ 包含了站点所有用的 class 文件,包括 se ...

  9. java web项目中classes文件夹下的class和WEB-INF/lib中jar里的class文件加载顺序

    如果是发布到weblogic的话,可以在WebContent\WEB-INF\weblogic.xml里面配置.参考配置如下:<?xml version="1.0" enco ...

随机推荐

  1. HDU 3072 (强连通分量)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3072 题目大意:为一个有向连通图加边.使得整个图全连通,有重边出现. 解题思路: 先用Tarjan把 ...

  2. jquery属性过滤选择器

    http://www.jb51.net/article/46279.htm   $("div[id]").addClass("highlight"); //查找 ...

  3. ubifs性能优化分析

    本文通过分析ubifs的mount.read.write和commit流程,挖掘ubifs背后的设计决策和性能优化手段,并结合自身产品的特点,给出一些读写性能改进方案.   1.     ubifs  ...

  4. 【BZOJ】3621: 我想那还真是令人高兴啊

    http://www.lydsy.com/JudgeOnline/problem.php?id=3621 题意:给两个三角形,问A能否通过旋转伸缩到B. #include <bits/stdc+ ...

  5. 实现Map-side Join和Reduce-side Join(转)

    在大数据处理场景中,多表Join是非常常见的一类运算.为了便于求解,通常会将多表join问题转为多个两表连接问题.两表Join的实现算法非常多,一般我们会根据两表的数据特点选取不同的join算法,其中 ...

  6. 单例 (JAVA)

    java中单例模式是一种常见的设计模式,以下是它的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例 第一种(懒汉,线程不安全):  1 publ ...

  7. android-ContentProvider

    一.理解ContentProvider 为了在应用程序之间交换数据,Android提供了ContentProvider,它是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据暴露 ...

  8. thinkphp无法加载模块解决办法

    前台入口文件index.php <?php //前台入口 define('THINKPHP_PATH', '../ThinkPHP/');//底层的位置 define('APP_PATH', ' ...

  9. *HDU 1286,2824欧拉函数

    #include<iostream> #include<string> #include<cstdio> #include<cmath> #includ ...

  10. css问题 ie7兼容性问题

    1.响应式网站用百分比时ie7不兼容:试试将margin:0 10% 改为margin-left:15%; 左边是可以的,但是右边就不行了 2.ie7的span 里的字会出现白色背景 ,是因为没有定高 ...