Skip to content

MVC 5 学习

依赖注入Niject

  1. 安装 Niject组件

  2. 会添加 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)); ```

  1. 添加一个 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 语法

  1. 基本语法 ```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" })

```

  1. 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 属性上