如何使用 MVC 中的视图模型在剃须刀视图中显示多个模型?
How to use View Models in MVC to display multiple model in razor view?
我刚开始使用 mvc 在做了这么多研发之后我开始了这个测试项目,但现在陷入了我不知道如何创建一个视图模型来显示来自两个不同模型的数据的情况。
模型 1
public class Product
{
public int ProductId { get; set; }
[Required(ErrorMessage = "Enter Product name")]
[StringLength(160)]
public string ProductName { get; set; }
[Required(ErrorMessage = "Enter Product Description")]
[StringLength(500)]
public string ProductDescription { get; set; }
public Product() { this.AddDate = DateTime.Now; }
public DateTime AddDate { get ; private set; }
[Required(ErrorMessage = "Select Category")]
[Display(Name="Category")]
public string Category { get; set; }
[Required(ErrorMessage = "Location")]
public bool location { get; set; }
}
模型 2
public class ProductPicture
{
public int id { get; set; }
public int ProductId { get; set; }
[Required(ErrorMessage ="Please Select Picture")]
public string pictureurl { get; set; }
}
通过使用视图模型,如果每个产品只有一张图片,我可以显示,但由于有多个,所以我如何才能获取第一张图片或图片列表并将其显示到剃刀视图中。
下面是我的控制器,视图都是乱七八糟的:|
public ActionResult Details(long? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ProductViewModel product = new ProductViewModel();
Mapper.CreateMap<Product, ProductViewModel>().ForMember(m => m. );
var pro = Mapper.Map< ProductViewModel>(product);
product.ProductPictures = db.ProductPictures.Where(m => m.ProductId == id);
// product.Products = db.Products.Where(m=>m.ProductId==id);
//Product product = db.Products.Find(id);
if (product == null)
{
return HttpNotFound();
}
return View(product);
}
详情查看
@model sullivan.Models.ProductViewModel
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
<div class="col-sm-7">
<div class="product-information">
<!--/product-information-->
<img src="images/product-details/new.jpg" class="newarrival" alt="" />
<h2>@Html.DisplayFor(model => model.ProductName)</h2>
<p>
@Html.DisplayFor(model => model.ProductDescription)</p>
<img src="images/product-details/rating.png" alt="" />
<a href=""><img src="images/product-details/share.png" class="share img-responsive" alt="" /></a>
</div><!--/product-information-->
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.ProductId }) |
@Html.ActionLink("Back to List", "Index")
</p>
</div>
<div id="similar-product" class="carousel slide" data-ride="carousel">
<!-- Wrapper for slides -->
<div class="carousel-inner">
<div class="item active">
@foreach (var Picture in Model.ProductPictures)
{
<a href=""><img src="~/images/wallimages/imagepath/thumb2_@Picture.pictureurl" alt=""></a>
}
</div>
</div>
<!-- Controls -->
<a class="left item-control" href="#similar-product" data-slide="prev">
<i class="fa fa-angle-left"></i>
</a>
<a class="right item-control" href="#similar-product" data-slide="next">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
在剃须刀视图中,我可以在底部单独获取图像列表,但我只需要产品的第一张图像和其他数据,我该如何实现?
假设您的 ProductViewModel
中有一个 ProductImage
属性 string
.
public class ProductViewModel
{
public string ProductImage { set;get;}
//Other existing properties
}
并且在您的操作方法中,您可以调用产品图片集的 First()
方法(如果至少存在一个)
var product = new ProductViewModel();
var pictures = db.ProductPictures.Where(m => m.ProductId == id);
if(pictures!=null && pictures.Any())
{
product.ProductImage = pictures.First(x=>x.pictureurl);
}
或
如果您的视图模型中已经有一个集合 属性 来存储产品图像 url 列表,但不想创建一个新集合来存储第一张图像,您可以简单地对该集合调用 First() 方法在您的剃刀视图中
<h1>Product Image</h1>
@if(Model.ProductPictures.Any())
{
<div>
<img src="~/images/wallimages/imagepath/thumb2_@Model.ProductPictures.First().pictureurl" />
</div>
}
我刚开始使用 mvc 在做了这么多研发之后我开始了这个测试项目,但现在陷入了我不知道如何创建一个视图模型来显示来自两个不同模型的数据的情况。
模型 1
public class Product
{
public int ProductId { get; set; }
[Required(ErrorMessage = "Enter Product name")]
[StringLength(160)]
public string ProductName { get; set; }
[Required(ErrorMessage = "Enter Product Description")]
[StringLength(500)]
public string ProductDescription { get; set; }
public Product() { this.AddDate = DateTime.Now; }
public DateTime AddDate { get ; private set; }
[Required(ErrorMessage = "Select Category")]
[Display(Name="Category")]
public string Category { get; set; }
[Required(ErrorMessage = "Location")]
public bool location { get; set; }
}
模型 2
public class ProductPicture
{
public int id { get; set; }
public int ProductId { get; set; }
[Required(ErrorMessage ="Please Select Picture")]
public string pictureurl { get; set; }
}
通过使用视图模型,如果每个产品只有一张图片,我可以显示,但由于有多个,所以我如何才能获取第一张图片或图片列表并将其显示到剃刀视图中。
下面是我的控制器,视图都是乱七八糟的:|
public ActionResult Details(long? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ProductViewModel product = new ProductViewModel();
Mapper.CreateMap<Product, ProductViewModel>().ForMember(m => m. );
var pro = Mapper.Map< ProductViewModel>(product);
product.ProductPictures = db.ProductPictures.Where(m => m.ProductId == id);
// product.Products = db.Products.Where(m=>m.ProductId==id);
//Product product = db.Products.Find(id);
if (product == null)
{
return HttpNotFound();
}
return View(product);
}
详情查看
@model sullivan.Models.ProductViewModel
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
<div class="col-sm-7">
<div class="product-information">
<!--/product-information-->
<img src="images/product-details/new.jpg" class="newarrival" alt="" />
<h2>@Html.DisplayFor(model => model.ProductName)</h2>
<p>
@Html.DisplayFor(model => model.ProductDescription)</p>
<img src="images/product-details/rating.png" alt="" />
<a href=""><img src="images/product-details/share.png" class="share img-responsive" alt="" /></a>
</div><!--/product-information-->
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.ProductId }) |
@Html.ActionLink("Back to List", "Index")
</p>
</div>
<div id="similar-product" class="carousel slide" data-ride="carousel">
<!-- Wrapper for slides -->
<div class="carousel-inner">
<div class="item active">
@foreach (var Picture in Model.ProductPictures)
{
<a href=""><img src="~/images/wallimages/imagepath/thumb2_@Picture.pictureurl" alt=""></a>
}
</div>
</div>
<!-- Controls -->
<a class="left item-control" href="#similar-product" data-slide="prev">
<i class="fa fa-angle-left"></i>
</a>
<a class="right item-control" href="#similar-product" data-slide="next">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
在剃须刀视图中,我可以在底部单独获取图像列表,但我只需要产品的第一张图像和其他数据,我该如何实现?
假设您的 ProductViewModel
中有一个 ProductImage
属性 string
.
public class ProductViewModel
{
public string ProductImage { set;get;}
//Other existing properties
}
并且在您的操作方法中,您可以调用产品图片集的 First()
方法(如果至少存在一个)
var product = new ProductViewModel();
var pictures = db.ProductPictures.Where(m => m.ProductId == id);
if(pictures!=null && pictures.Any())
{
product.ProductImage = pictures.First(x=>x.pictureurl);
}
或 如果您的视图模型中已经有一个集合 属性 来存储产品图像 url 列表,但不想创建一个新集合来存储第一张图像,您可以简单地对该集合调用 First() 方法在您的剃刀视图中
<h1>Product Image</h1>
@if(Model.ProductPictures.Any())
{
<div>
<img src="~/images/wallimages/imagepath/thumb2_@Model.ProductPictures.First().pictureurl" />
</div>
}