MVC 5 学习
依赖注入Niject
-
安装 Niject组件
-
会添加 NinjectWebCommon 文件
```csharp // 动态注册组件 [assembly: WebActivator.PreApplicationStartMethod(typeof(EssentialTools.App_Start.NinjectWebCommon), "Start")] [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(EssentialTools.App_Start.NinjectWebCommon), "Stop")]
// RegisterServices 时挂入 NinjectDependencyResolver System.Web.Mvc.DependencyResolver.SetResolver(new EssentialTools.Infrastructure.NinjectDependencyResolver(kernel)); ```
- 添加一个 NinjectDependencyResolver 文件
csharp
// 添加控制器初始化时传入参数,会链式初始化
private void AddBindings() {
// 需要 IValueCalculator 时 new 出 LinqValueCalculator
kernel.Bind<IValueCalculator>().To<LinqValueCalculator>().InRequestScope();
// 需要 IDiscountHelper 时 new 出 DefaultDiscountHelper,并将属性 discountParam 设置为 50M
kernel.Bind<IDiscountHelper>().To<DefaultDiscountHelper>().WithConstructorArgument("discountParam", 50M);
// 需要 IDiscountHelper 时 new 出 FlexibleDiscountHelper 当在 LinqValueCalculator 中被使用时
// when / whencalsshas / wheninjectedinto
kernel.Bind<IDiscountHelper>().To<FlexibleDiscountHelper>().WhenInjectedInto<LinqValueCalculator>();
// 只使用一个实例
// 也可以 一个线程一个实例,一个请求一个实例,全局一个实例或每次解析一个实例
kernel.Bind<IDiscountHelper>().***.InSingletonScope();
}
Razor 语法
- 基本语法 ```csharp @{ Layout = null } // <-- 指定模板路径, 设置为 null 为不使用模板。如果不设置为使用 _ViewStart.cshtml @RenderBody() // <-- 模板页中指定使用子页面 @model Razor.Models.Product // <-- 全局 Model 绑定为一个强类型对象 @Model.Title // <-- 使用 @ViewData <-- 字典 @ViewBag <-- ViewData 的 dynamic 表现 @TempData <-- 类似于 ViewData 但是可以在页面间跳转时存在, 基于 Session (有说保存至下一次读取为止) Session <-- 基于用户 cookies
<-- 会自动将 Supper 转为有效值
@: <-- 后面的内容停止使用 Razor 语法 解析
@using Razor.Models <-- 使用命名空间
// 使用子组件 @html.Partial("子组件名", 参数) <-- 使用子组件 @@Html.Action("Menu", "Nav") <-- 调用控制器中的 Menu 方法,并将结果显示出来, Menu 方法可以直接返回字符串或是对象或是一个 PartialViewResult 子组件,比如 return PartialView(categories);
// 历遍 ViewData 中的属性 foreach (var property in ViewData.ModelMetadata.Properties) @Html.TextBox(property.PropertyName, null, new { @class = "form-control" })
```
- Html 扩展
```csharp @Html.Action("函数名") <-- 调用子组件 @Html.ActionLink <-- 生成一个链接 @Html.RouteLink 根据 router <-- 中的配置生成一个链接 @Html.TextBox(name, value, new{}) <-- 直接生成控件 @Html.TextBoxFor(x => x.PropertyName, new {}) <-- ***For 通过反射,返回属性字符串生成控件。 还可以使用 Desplay(显示) 及 Required(校验) 等属性扩展 @Html.ValidationSummary <-- 显示错误信息, 可通过 ModelState.AddModelError 添加错误信息 @Html.DisplayFor @Html.EditForModel() <-- 自动为 Model 中的属性创建相应的编辑控件 , 可以使用 HiddenInput, DataType 等属性定制
```
图像上传
view:
Html.BeginForm("Edit", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" })
<input type="file" name="image" />
controler:
[HttpPost]
public ActionResult Edit(Product product, HttpPostedFileBase image = null) {
image.ContentType;
new byte[image.ContentLength];
image.InputStream.Read(product.ImageData, 0, image.ContentLength);
}
view(显示):
<img src="@Url.Action("GetImage", "Product", new {productId})" />
public FileContentResult GetImage(int productId){
var prod = productManager.FindProduct(productId);
return File(prod.ImageData, prod.ImageMimeType);
}
模型绑定
可以自动为 http 请求创建一些对象
普通模型绑定
// 原来代码直接从 session 中读取 car 数据,这样可以使用模型绑定自动生成
public class CartModelBinder : IModelBinder {
private const string sessionKey = "Cart";
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext) {
// 尝试从 session 中改得
Cart cart = null;
if (controllerContext.HttpContext.Session != null) {
cart = (Cart)controllerContext.HttpContext.Session[sessionKey];
}
// 如果 session 中没有,则创建一个并加入到 session 中
if (cart == null) {
cart = new Cart();
if (controllerContext.HttpContext.Session != null) {
controllerContext.HttpContext.Session[sessionKey] = cart;
}
}
// return the cart
return cart;
}
// Application_Start 中注册
ModelBinders.Binders.Add(typeof(Cart), new CartModelBinder());
// controller 中
public RedirectToRouteResult RemoveFromCart(Cart cart, int productId, string returnUrl) {
// car 自动从 session 中 恢复
}
模型验证
// 服务端验证
[Required(ErrorMessage(''))]
[Range(0.0.1, doubleMaxValue, ErrorMessage(''))]
@Html.ValidationMessage("name") <-- 显示单个属性的错误信息
// 客户端验证
加入 jquery
HtmlHelp.ClientValidationEnabled = false
HtmlHelp.UnobtrusiveJavaScriptEnabled = false
授权
见:《asp.net 认证.md》
[Authorize]
放在控制器上,表示访问该控制器需要授权,会被定位至 web.config 的 forms 的 loginurl 属性上