从索引视图传递IEnumerable模型(使用较低级别的模型类到Details视图(使用ViewModel类))

时间:2015-09-06 13:06:57

标签: c# asp.net-mvc asp.net-mvc-4

寻求帮助,理解我如何将一个id值从一个绑定基本模型PlacementOrganisation的INDEX视图传递到同一控制器中的DETAILS视图,而该控制器反而引用一个视图模型(如果语言不正确则道歉)此对象带有相关的Placement对象。

PlacementOrganisation类如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Placementv2.Models
{
    public class PlacementOrganisation
    {
        public int PlacementOrganisationID { get; set; }
        public string Name { get; set; }
    }
}

“包装器”PlacementOrganisationIndexData ViewModel类如下:

using System.Collections.Generic;
using Placementv2.Models;
using System.Linq;
using System;
using System.Web;
using IdentitySample.Models;
using PagedList;
namespace Placementv2.ViewModels
{
    public class     PlacementOrganisationIndexData
    {
        public IEnumerable<PlacementOrganisation> PlacementOrganisations { get; set; }
        public IEnumerable<Placement> Placements { get; set; }


    }
}

我的控制器包含许多控制器操作,包括如下的索引视图,通过调试我已经确认正确地将记录的ID传递给详细信息视图

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using IdentitySample.Models;
using Placementv2.Models;
using Placementv2.ViewModels;
using PagedList;

namespace Placementv2.Controllers
{
    // [RequireHttps] 

    [Authorize(Roles = "UserAdmin")]
    [Authorize(Roles = "SysAdmin")]

    public class PlacementOrganisationsController : Controller
    {
        private ApplicationDbContext db = new ApplicationDbContext();

        // GET: PlacementOrganisations
   public ActionResult Index(string sortOrder, string searchString, int page = 1)
    {
        var organisations = from s in db.PlacementOrganisations
                            select s;

        return View(organisations.ToPagedList(page, 10));

    }

PlacementOrganisations控制器的索引视图如下:

@model PagedList.IPagedList<Placementv2.Models.PlacementOrganisation>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "PlacementOrganisations", FormMethod.Get))
{ <p> Find an Organisation : @Html.TextBox("SearchString", ViewBag.CurrentFilter as string) <input type="submit" value="Search" class="btn btn-primary" /> 
      @Html.ActionLink("Clear Search", "Index", null, new { @class = "btn btn-info" })
   </p> }


<table class="table">
    <tr>
        <th>
            @Html.ActionLink("Name", "Index", new { sortOrder = ViewBag.NameSortParm })
        </th>
        </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>@Html.DisplayFor(modelItem => item.Name)</td>

                @Html.ActionLink("Details", "Details", new { id = item.PlacementOrganisationID }) |
            </td>
        </tr>
    }

</table>

<br />
@Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }),
        PagedListRenderOptions.ClassicPlusFirstAndLast)

我现在或多或少地停放了PlacementOrganisations Details视图,因为我很难将ViewModel绑定到Index视图中的传入id。

我想在此处使用ViewModel的原因是在单个视图中显示有关PlacementOrganisation以及与此PlacementOrganisation相关的展示位置的用户信息。

我的问题是我无法访问Viewmodel对象中PlacementOrganisation对象的ID属性,以将其绑定到id。

我已经尝试在Intellisense中广泛地寻找我需要的属性但却找不到它。我还回顾了以前在S / O上提出的相关问题,但这些问题看起来都不是这样的。

(作为一个承认这可能的新手并不感到羞耻可能是因为我以错误的方式解决这个问题!) 这是我到目前为止最接近的

public ActionResult Details(int id)
{

    var organisationModel = new PlacementOrganisationIndexData();


    organisationModel.PlacementOrganisations= db.PlacementOrganisations.Find(id);


    PopulateCountiesDropDownList(OrganisationModel.PlacementOrganisations.);
    PopulatePlacementTypesDropDownList(ViewBag.PlacementTypeID);
    return View(organisationModel);

    }

感谢您抽出宝贵时间来研究这个问题。

2 个答案:

答案 0 :(得分:1)

首先在参数中添加问号。

并将方法的前两行更改为一行。

你也有一个无关的终点。

public ActionResult Details(int? id)
{
    var organisationModel= db.PlacementOrganisations.Find(id);
    // Remove fullstop from end of line below
    PopulateCountiesDropDownList(OrganisationModel.PlacementOrganisations.);
    PopulatePlacementTypesDropDownList(ViewBag.PlacementTypeID);
    return View(organisationModel);
}

我不确定你为什么把它放在ViewModels命名空间中。我会想到的 模型命名空间应该是它应该去的地方,因为控制器正在从这个命名空间访问数据。

namespace Placementv2.ViewModels

namespace Placementv2.Models

此外,在您的应用程序数据库上下文中,您可能需要添加这些类。

public class ApplicationDbContext :  DbContext // Or what ever your database
                                               // context has
{

    public DbSet<PlacementOrganisation> PlacementOrganisations { get; set; }
    public DbSet<Placement> Placements { get; set; }

如果这不能解决您的问题,请告诉我。

答案 1 :(得分:1)

最终弄明白了。下面的代码返回一个IndexData对象,该对象又由两个ienumerables组成,然后我可以在我的视图中使用

  public ActionResult Details(int? id)
        {
            var viewModel = new PlacementOrganisationIndexData();
            viewModel.PlacementOrganisations = db.PlacementOrganisations.Where(p => p.PlacementOrganisationID == id.Value);
            viewModel.Placement= db.Placements.Where(c => c.PlacementOrganisationID == id.Value);

            return View(viewModel);

            }