我正在使用WCF服务访问Controller中的数据。
public ActionResult Index()
{
DataRerieveClient _proxy = new DataRerieveClient();
var orderDetails = _proxy.GetProductDetails(null);
return View();
}
现在如何从Controller中传递orderdetails
以查看以及如何在View中访问它们。
修改
我有一个模特:
public class OrderDetails
{
public int OrderId { get; set; }
public int ProductId { get; set; }
public decimal UnitPrice { get; set; }
public int quanity { get; set; }
public decimal Discount { get; set; }
}
和_proxy.GetProductDetails(null)
返回List<ServiceType.OrderDetails>
EDIT2:
public class AutoMapperConfig
{
public static void Configure()
{
Mapper.Map(ServiceOrders.OrderDetails, NorthWindMVCWCF.Models.OrderDetails);
}
}
现在收到错误
'NorthWindMVCWCF.ServiceOrders.OrderDetails'是'type',在给定的上下文中无效 'NorthWindMVCWCF.Models.OrderDetails'是'type',在给定的上下文中无效
答案 0 :(得分:2)
我更喜欢创建视图模型,我会按如下方式进行:
创建视图模型
public class OrderDetailViewModel
{
public int OrderId { get; set; }
public int ProductId { get; set; }
public decimal UnitPrice { get; set; }
public int Quanity { get; set; }
public decimal Discount { get; set; }
}
public class OrderDetailsViewModel
{
public OrderDetailsViewModel()
{
OrderDetails = new List<OrderDetailsViewModel>();
}
public List<OrderDetailsViewModel> OrderDetails { get; set; }
}
手动投影
您可以创建OrderDetails
视图模型并手动投影实例,如下所示:
var orderDetailsViewModel = new OrderDetailsViewModel();
foreach(var orderdetail in orderDetails)
{
orderDetailsViewModel.Add(new OrderDetailsViewModel { OrderId = orderDetail.OrderId, ProductId = orderDetail.ProductId, UnitPrice = orderDetail.UnitPrice, Quanity = orderDetail.quantity, Discount = orderDetail.Discount });
}
AutoMapper替代投影</ strong>
安装AutoMapper,从包管理器控制台运行以下命令:
Install-Package AutoMapper
使用映射在AutoMapperConfig.cs
文件夹中创建App_Start
,类似于以下内容:
public static class AutoMapperConfig
{
public static void Configure()
{
Mapper.CreateMap<OrderDetails, OrderDetailViewModel>();
}
}
在全局asax中调用configure方法:
protected void Application_Start()
{
...
AutoMapperConfig.Configure();
...
}
然后在你的控制器中映射:
var orderDetailsViewModel = new OrderDetailsViewModel();
orderDetailsViewModel.OrderDetails = Mapper.Map<List<OrderDetails>, List<OrderDetailsViewModel>>(orderDetails);
我更喜欢使用AutoMapper方法,因为映射是全局定义的,可以在您的应用中重复使用。
返回您的视图模型
您的视图模型将按如下方式传回:
return View(orderDetailsViewModel);
剃刀输出
您可以在视图中通过在顶部添加模型参考来访问它:
@model OrderDetailsViewModel
然后按如下方式输出属性,我只包含OrderId
但你可以用同样的方式添加字段:
<table>
<tr>
<th>OrderId</th>
</tr>
@foreach(var orderDetail in Model.OrderDetails)
{
<tr>
<td>@orderDetail.OrderId</td>
</tr>
}
</table>
答案 1 :(得分:1)
您已为此创建ViewModel。
例如,在您的模型文件夹中创建一个类:
public class MyViewModel // Whatever name you want to give
{
//My fields which I want to pass to View
publis string Field1{get;set;}
etc
etc
}
public ActionResult Index()
{
DataRerieveClient _proxy = new DataRerieveClient();
var orderDetails = _proxy.GetProductDetails(null);
List<MyViewModel> viewModelList = new List<MyViewModel>();
foreach(var orderDetail in orderDetails)
{
MyViewModel viewModel = new MyViewModel(); //Create an object of your ViewModel
viewModel.Field1 = orderDetails.Field1; //set all feilds like that
viewModelList.Add(viewModel);
}
return View(viewModelList); // Pass View Model to View
}
注意:您必须为ViewModel创建View 喜欢
@model `List<MyViewModel>`
然后使用此ViewModel访问属性。
要了解有关ViewModel的更多信息,请参阅以下链接:
http://sampathloku.blogspot.ae/2012/10/how-to-use-viewmodel-with-aspnet-mvc.html
答案 2 :(得分:0)
在Controller类中写:
public ActionResult Index()
{
DataRerieveClient _proxy = new DataRerieveClient();
var orderDetails = _proxy.GetProductDetails(null);
return View(orderDetails);
}
我假设你的项目名称是MvcApplication2,你的类名在模型文件夹中。所以在View(sample.cshtml)的顶部添加以下代码:
@model MvcApplication2.Models.OrderDetail
好的,您可以使用此代码访问DataRecieveClient的属性:
<div class="display-label">
@Html.DisplayNameFor(model => model.F1)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.F1)
</div>
抱歉英语不好。!