如何将详细模型从控制器传递到视图

4
我正在使用 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' 是一个“类型”,在给定的上下文中无效。


我更新了我的答案。我认为你可以从中得到一个好的想法。 - Usman Khalid
3个回答

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替代方案

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

Install-Package AutoMapper

App_Start文件夹中创建一个名为AutoMapperConfig.cs的文件,其中包含映射信息,类似于以下代码示例:
public static class AutoMapperConfig
{
  public static void Configure()
  {
    Mapper.CreateMap<OrderDetails, OrderDetailViewModel>();
  }
}

在您的global 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);

Razor输出

在视图中,您可以通过在顶部添加模型引用来访问它:

@model OrderDetailsViewModel

然后按照以下方式输出属性,我只包括了OrderId,但你可以同样的方式添加字段:
<table>
<tr>
<th>OrderId</th>
</tr>
@foreach(var orderDetail in Model.OrderDetails)
{
  <tr>
    <td>@orderDetail.OrderId</td>
  </tr>
}
</table>

我在编辑我的问题时进行了一些澄清,请您看一下。 - Simsons
好的,我已根据您的要求对问题进行了更新,更加具体了。 :) - hutchonoid
AutoMapper看起来很有趣,我应该在哪个类中声明映射呢?因为有FilterConfig.cs、RouteConfig.cs和WebApiConfig.cs。 - Simsons
Automapper 正试图将 Service 类型映射到 Model 类型。但是为什么我会收到错误呢? - Simsons
在您的配置中,您需要调用CreateMap,这是定义映射的地方。例如:Mapper.CreateMap<NorthWindMVCWCF.Models.OrderDetails,ServiceOrders.OrderDetails>; 您可以在那里配置特定的映射,例如可能有某些字段需要忽略等。 - hutchonoid
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/47859/discussion-between-simsons-and-hutchonoid - Simsons

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创建视图。 例如:

@model `List<MyViewModel>`

然后使用此ViewModel访问属性。

要了解更多有关ViewModel的信息,请参阅以下链接:

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


0
在控制器类中编写以下代码:
public ActionResult Index()
{
   DataRerieveClient _proxy = new DataRerieveClient();
   var orderDetails = _proxy.GetProductDetails(null);
   return View(orderDetails);
}

我假设您的项目名称为MvcApplication2,类名在Model文件夹中。因此,请在视图(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>

抱歉我的英文不好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接