今天要来实作 Details 详细资料页面
ViewModel 是拿来对 MVC 一个 View 只能对应一个 Model 的概念
所做出的因应对策,其实就是把需要用到的 Model 跟资料再用一个更大 Model 包起来,就成了所谓的 ViewModel。就如同名字 ViewModel 只应该拿来显示资料用,不要直接拿来对资料库操作。
在 Model 的资料夹新增一个 DetailViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace OnlineShopCMS.Models
{
public class DetailViewModel
{
public Product product { get; set; }
public string imgsrc { get; set; }
}
}
简单的显示也可以直接用 ViewData ViewBag 来实现就好,ViewModel 通常是前端画面需要多个模型的时候使用。今天的例子主要是想要拿来示范,实际在操作的时候不见得需要用到 ViewModel。
ProductsController.cs
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
DetailViewModel dvm = new DetailViewModel(); //建立一个 ViewModel
var product = await _context.Product
.Include(p => p.Category)
.FirstOrDefaultAsync(m => m.Id == id);
if (product == null)
{
return NotFound();
}
else
{
dvm.product = product;
if (product.Image != null)
{
dvm.imgsrc = ViewImage(product.Image);
}
}
return View(dvm); //回传 ViewModel
}
private string ViewImage(byte[] arrayImage)
{
// 二进位图档转字串
string base64String = Convert.ToBase64String(arrayImage, 0, arrayImage.Length);
return "data:image/png;base64," + base64String;
}
前端 Details.cshtml
改为 @DetailViewModel
模型来接
@model OnlineShopCMS.Models.DetailViewModel
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Product</h4>
<hr />
<dl class="row">
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Image)
</dt>
<dd class = "col-sm-10">
<img src="@Html.DisplayFor(model => model.imgsrc)" /> //图片
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.product.Name)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.product.Name) //名称
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.product.Description)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.product.Description) //简介
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.product.Price)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.product.Price) //价格
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.product.Stock)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.product.Stock) //库存
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.product.Content)
</dt>
<dd class = "col-sm-10">
@Html.Raw(Model.product.Content) //内容
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
最後排版一下看看成果如何
<<: Day9|工作区、暂存区、储存库,以及各执行的档案状态
参赛心得 其实会参加这个比赛是学校老师出的一个自学作业,完全想不到到了大三还会有暑假作业,在开赛之前...
注:本文同步刊载在Medium,若习惯Medium的话亦可去那边看呦! 因为按照惯例,第三十天主要会...
今天大概的进度要进到Controlling Program Flow,不过我自己对於这个章节好像没有...
开发工具: 我们这边使用Visual Studio 2017来做为程序的编译工具, 其他版本来做练习...
今天我们要介绍的是随机森林,所谓的随机森林就是指将多个决策树组合而成并且加入随机的分配去训练资料,而...