【问题标题】:How to Pass Details Model from Controller to View如何将细节模型从控制器传递到视图
【发布时间】:2014-02-19 11:20:04
【问题描述】:

我正在使用 WCF 服务访问控制器中的数据。

 public ActionResult Index()
        {
            DataRerieveClient _proxy = new DataRerieveClient();
            var orderDetails = _proxy.GetProductDetails(null);
            return View();
        }

现在如何将 orderdetails 从 Controller 传递到视图以及如何在视图中访问它们。

编辑:

我有一个模型:

 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. 如何在我的视图中的表格中显示列表值?

编辑2:

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

现在出现错误

“NorthWindMVCWCF.ServiceOrders.OrderDetails”是一个“类型”,在给定的上下文中无效 “NorthWindMVCWCF.Models.OrderDetails”是一个“类型”,在给定的上下文中无效

【问题讨论】:

  • 我更新了我的答案。我想你可以从中得到一个好主意。

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


【解决方案1】:

我更喜欢创建视图模型,我会这样做:

创建视图模型

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 替代投影

安装 AutoMapper,从包管理器控制台运行以下命令:

Install-Package AutoMapper

使用映射在App_Start 文件夹中创建AutoMapperConfig.cs,如下所示:

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>

【讨论】:

  • 在编辑我的问题时做了一些澄清,请你看看
  • 好的,已将问题更新为更具体。 :)
  • AutoMapper 似乎很有趣,我应该在哪个类中声明 Mapping ,因为那里有 FilterConfig.cs、RouteConfig.cs 和 WebApiConfig.cs
  • 所以 Automapper 正在尝试将服务类型映射到模型类型。但是为什么我会收到错误
  • 在您的配置中,您需要调用 CreateMap,这是定义映射的地方。即 Mapper.CreateMap;您可以在那里配置特定的映射,例如可能需要忽略某些字段等。
【解决方案2】:

您已经为此创建了 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 创建视图 喜欢

@model `List<MyViewModel>`

然后使用此 ViewModel 访问属性。

要详细了解什么是 ViewModel,请参考以下链接:

http://sampathloku.blogspot.ae/2012/10/how-to-use-viewmodel-with-aspnet-mvc.html

【讨论】:

    【解决方案3】:

    在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>
    

    抱歉英语不好。!

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多