<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      ASP.NET MVC 4 - 上傳圖片到數據庫

      這里演示如何在MVC WEB應用程序如何上傳圖片到數據庫以及如何在WEB頁面上顯示圖片。數據庫表對應整個Model類,不單圖片數據一個字段,我們從數據表的定義開始:

      CREATE TABLE [dbo].[Products] (
          [ProductID]     INT             IDENTITY (1, 1) NOT NULL,
          [Name]          NVARCHAR (MAX)  NOT NULL,
          [Description]   NVARCHAR (MAX)  NOT NULL,
          [Price]         DECIMAL (18, 2) NOT NULL,
          [Category]      NVARCHAR (MAX)  NOT NULL,
          [ImageData]     VARBINARY (MAX) NULL,
          [ImageMimeType] NVARCHAR (MAX)  NULL,
          CONSTRAINT [PK_dbo.Products] PRIMARY KEY CLUSTERED ([ProductID] ASC)
      );

      保存圖片的字段為ImageData,類型VARBINARY,字段ImageMimeType保存圖片的類型。我們使用Entity framework處理c#對象到數據庫的操作,我們不需要編寫代碼通過SQL代碼操作數據庫,Entity framework負責數據庫的操作。Entity framework支持Model first和Code-first兩種方式,Code-first先編寫c# model類,然后綁定到數據庫,相關的內容可以參見http://msdn.microsoft.com/en-us/data/jj200620

      從Model類開始: 

      public class Product {
      
              [HiddenInput(DisplayValue = false)]
              public int ProductID { get; set; }
      
              [Required(ErrorMessage = "Please enter a product name")]
              public string Name { get; set; }
      
              [DataType(DataType.MultilineText)]
              [Required(ErrorMessage = "Please enter a description")]
              public string Description { get; set; }
      
              [Required]
              [Range(0.01, double.MaxValue, ErrorMessage = "Please enter a positive price")] 
              public decimal Price { get; set; }
      
              [Required(ErrorMessage = "Please specify a category")]
              public string Category { get; set; }
      
              public byte[] ImageData { get; set; }
      
              [HiddenInput(DisplayValue = false)]
              public string ImageMimeType { get; set; }
          }

      Entity framework可以在VS中使用nuget package manager安裝,安裝完entity framework我們創建Entity framework的會話類將Model和數據庫聯系起來:

      using System.Data.Entity;
      
      namespace SportsStore.Domain.Concrete {
      
          public class EFDbContext : DbContext {
              public DbSet<Product> Products { get; set; }
          }
      }

      我們還需要告訴Entity framework使用哪個數據庫,在web.config添加相應的連接字符串:

      ...
      <connectionStrings>
          <add name="EFDbContext" connectionString="Data Source=(localdb)\v11.0;Initial Catalog=SportsStore;Integrated Security=True" providerName="System.Data.SqlClient"/>
        </connectionStrings>
      ...

      接下來創建一個使用EFDbContext操作Model的輔助類:

      public interface IProductRepository {
      
              IQueryable<Product> Products { get; }
      
              void SaveProduct(Product product);
      
              Product DeleteProduct(int productID);
          }
      
      public class EFProductRepository : IProductRepository
          {
              private EFDbContext context = new EFDbContext();
      
              public IQueryable<Product> Products
              {
                  get { return context.Products; }
              }
      
              public void SaveProduct(Product product)
              {
      
                  if (product.ProductID == 0)
                  {
                      context.Products.Add(product);
                  }
                  else
                  {
                      Product dbEntry = context.Products.Find(product.ProductID);
                      if (dbEntry != null)
                      {
                          dbEntry.Name = product.Name;
                          dbEntry.Description = product.Description;
                          dbEntry.Price = product.Price;
                          dbEntry.Category = product.Category;
                          dbEntry.ImageData = product.ImageData;
                          dbEntry.ImageMimeType = product.ImageMimeType;
                      }
                  }
                  context.SaveChanges();
              }
      
              public Product DeleteProduct(int productID)
              {
                  Product dbEntry = context.Products.Find(productID);
                  if (dbEntry != null)
                  {
                      context.Products.Remove(dbEntry);
                      context.SaveChanges();
                  }
                  return dbEntry;
              }
          }

      定義IProductRepository接口是方便后續使用Dependency injection從接口獲取實現類EFProductRepository的實例,這里就不列出具體如何實現。EFProductRepository使用EFDbContext完成添加、保存對象到數據庫以及從數據庫刪除對象。完成數據模型的操作,下面定義控制器的方法:

          public class AdminController : Controller {
              private IProductRepository repository;
      
              public AdminController(IProductRepository repo) {
                  repository = repo;
              }
      
              public ViewResult Index() {
                  return View(repository.Products);
              }
      
              public ViewResult Edit(int productId) {
                  Product product = repository.Products
                      .FirstOrDefault(p => p.ProductID == productId);
                  return View(product);
              }
      
              [HttpPost]
              public ActionResult Edit(Product product, HttpPostedFileBase image) {
                  if (ModelState.IsValid) {
                      if (image != null) {
                          product.ImageMimeType = image.ContentType;
                          product.ImageData = new byte[image.ContentLength];
                          image.InputStream.Read(product.ImageData, 0, image.ContentLength);
                      }
                      repository.SaveProduct(product);
                      TempData["message"] = string.Format("{0} has been saved", product.Name);
                      return RedirectToAction("Index");
                  } else {
                      // there is something wrong with the data values
                      return View(product);
                  }
              }
      
              public ViewResult Create() {
                  return View("Edit", new Product());
              }
      
              [HttpPost]
              public ActionResult Delete(int productId) {
                  Product deletedProduct = repository.DeleteProduct(productId);
                  if (deletedProduct != null) {
                      TempData["message"] = string.Format("{0} was deleted", 
                          deletedProduct.Name);
                  }
                  return RedirectToAction("Index");
              }
          }

      這里兩個Edit ation,第一個顯示編輯上傳頁面,帶HttpPost特性的用于處理編輯頁面提交回傳,提交的image數據為HttpPostedFileBase類型,我們從中取出圖像文件的數據保存到Model類的ImageData屬性,ContentType則記錄到ImageMimeType屬性。對應的Edit視圖:

      @model SportsStore.Domain.Entities.Product
      
      @{
          ViewBag.Title = "Admin: Edit " + @Model.Name;
          Layout = "~/Views/Shared/_AdminLayout.cshtml";
      }
      
      <h1>Edit @Model.Name</h1>
      
      @using (Html.BeginForm("Edit", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" })) {
          
          @Html.EditorForModel()
      
          <div class="editor-label">Image</div>
          <div class="editor-field">
              @if (Model.ImageData == null) {
                  @:None
              } else {
                  <img width="150" height="150" src="@Url.Action("GetImage", "Product", new { Model.ProductID })" />
              }
              <div>Upload new image: <input type="file" name="Image" /></div>
          </div>
              
          <input type="submit" value="Save" />
          @Html.ActionLink("Cancel and return to List", "Index")
      }

      這里指定表單的enctype=multipart/form-data,缺少這個屬性表單提交的數據中會只有圖片文件的名稱而不包含圖片文件的數據。圖片顯示img單元的src指向一個從product的action生成的網址,我們還需要實現這個方法:

      ... 
      public FileContentResult GetImage(int productId) { 
        Product prod = repository.Products.FirstOrDefault(p => p.ProductID == productId); 
        if (prod != null) { 
          return File(prod.ImageData, prod.ImageMimeType); 
        } else { 
          return null; 
        } 
      } 
      ... 

      這里從圖片文件數據和mime類型返回一個FileContentResult。

      這就是實現上傳圖片到數據庫的完整過程,實際的應用中我們還需要限制文件大小,通過文件后綴名或者ContentType檢查是否是有效的圖片文件。

      以上內容摘自《Apress Pro ASP.NET MVC 4》第四版,詳見原版 http://www.apress.com/9781430242369

      posted @ 2016-09-02 22:34  閆寶平  閱讀(1296)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日本一本正道综合久久dvd| 精品久久精品午夜精品久久| 精品国产美女福到在线不卡| 老司机性色福利精品视频| 拍摄av现场失控高潮数次| 国产精品99久久久久久www| 亚洲国产午夜精品福利| 日本丰满少妇裸体自慰| 亚洲高清有码中文字| 国产精品高清中文字幕| 中文字幕人乱码中文| 国内精品亚洲成av人片| 免费人成网站免费看视频| 欧美人与zoxxxx另类| 欧美人人妻人人澡人人尤物| 久久精品国产午夜福利伦理| 国产盗摄视频一区二区三区| 久久国产免费观看精品3| 少妇伦子伦情品无吗| 日韩一卡二卡三卡四卡五卡| 国产亚洲av人片在线播放| 亚洲中文字幕在线无码一区二区| 久久亚洲精品成人av秋霞| 无码福利一区二区三区| 老司机亚洲精品一区二区| 亚洲国产精品久久久天堂麻豆宅男| 被c到高潮疯狂喷水国产| 国产日韩av一区二区在线| 无码国产偷倩在线播放| 锡林浩特市| 熟妇人妻任你躁在线视频| 日夜啪啪一区二区三区| 精品无人乱码一区二区三区| 农民人伦一区二区三区| 欧美人禽zozo动人物杂交| 国产亚洲综合另类色专区| 国产第一页浮力影院入口| 最近中文字幕国产精品| 色老头亚洲成人免费影院| 一个人在看www免费| 精品国产成人亚洲午夜福利|