如何将详细模型从Controller传递到View

时间:2014-02-19 11:20:04

标签: c# asp.net asp.net-mvc wcf razor

我正在使用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>

  1. 在这种情况下我是否需要本地模型?
  2. 如何在视图中的表格中显示列表值?
  3. EDIT2:

    public class AutoMapperConfig
        {
            public static void Configure()
            {
                Mapper.Map(ServiceOrders.OrderDetails, NorthWindMVCWCF.Models.OrderDetails);
            }
        }
    

    现在收到错误

      

    'NorthWindMVCWCF.ServiceOrders.OrderDetails'是'type',在给定的上下文中无效   'NorthWindMVCWCF.Models.OrderDetails'是'type',在给定的上下文中无效

3 个答案:

答案 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>

抱歉英语不好。!