【问题标题】:MVC 5 Table-Per-Hierarchy ControllerMVC 5 Table-Per-Hierarchy 控制器
【发布时间】:2015-12-04 08:51:28
【问题描述】:

我有一个类代表我的 MVC 应用程序中所有下拉列表中的列表项:

public abstract class ReferenceItem
{
    public ReferenceItem()
    {
        Active = true;
        DisplayOrder = 999;
    }

    public Int64 ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public bool Active { get; set; }
    public int DisplayOrder { get; set; }
}

public class CustomerType : ReferenceItem
{
    public virtual ICollection<Customer> Customers { get; set; }
}

public class OrderType : ReferenceItem
{
    public virtual ICollection<Order> Orders { get; set; }
}

这一切都很好。创建一个表,每个参考项都由一个鉴别器列标记。我正在调用 ReferenceItem 视图,因为它们将接受任何类型的 ReferenceItem。问题是我必须为每种类型的 ReferenceItem 创建一个单独的、几乎相同的控制器,以便将正确的数据子集传递给视图。

有人可以建议或指导我使用一种资源,该资源描述了一种使用一个控制器和一组视图来适应简单的按层次结构表的场景的简洁方式吗?我考虑过控制器/类型/动作/id 的自定义路由,但是,对于 Web 开发来说,我还是个新手,我希望首先获得一些明智的见解。

谢谢。

根据要求,这里是当前编写的“几乎相同的控制器”的 Index 和 Details 操作方法。其他操作方法遵循类似的针对类型定制的方法。我想找到一种方法来编写一个可以管理任何类型的 ReferenceItem 的控制器。

    // Customer Types
    public class CustomerTypesController : Controller
    {
        private Context db = new Context();
        private string DisplayName = "Customer Type";
        private string DisplayNamePlural = "Customer Types";

        public ActionResult Index()
        {
            ViewBag.Header = DisplayNamePlural;
            return View("~/Views/ReferenceItems/Index.cshtml"
                , db.ReferenceItems.OfType<CustomerType>().ToList()
                    .OrderBy(o => o.DisplayOrder)
                    .ThenBy(o => o.Name));
        }

        public ActionResult Details(long? id)
        {
            ViewBag.Header = DisplayName;
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            CustomerType custType = (CustomerType)db.ReferenceItems.Find(id);
            if (custType == null)
            {
                return HttpNotFound();
            }

            return View("/Views/ReferenceItems/Details.cshtml", custType);
        }
    }

    // Order Types
    public class OrderTypesController : Controller
    {
        private Context db = new Context();
        private string DisplayName = "Order Type";
        private string DisplayNamePlural = "Order Types";

        public ActionResult Index()
        {
            ViewBag.Header = DisplayNamePlural;
            return View("~/Views/ReferenceItems/Index.cshtml"
                , db.ReferenceItems.OfType<OrderType>().ToList()
                    .OrderBy(o => o.DisplayOrder)
                    .ThenBy(o => o.Name));
        }

        public ActionResult Details(long? id)
        {
            ViewBag.Header = DisplayName;
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            OrderType orderType = (orderType)db.ReferenceItems.Find(id);
            if (orderType == null)
            {
                return HttpNotFound();
            }

            return View("/Views/ReferenceItems/Details.cshtml", orderType);
        }
    }

【问题讨论】:

  • 你能告诉我们你几乎相同的控制器吗?
  • 添加了控制器的采样。

标签: .net asp.net-mvc-5


【解决方案1】:

嗯,你应该有一个用于 ReferenceItems 的控制器吗?那么你可以有一个视图来显示一个 ReferenceItem,并有几个简单的视图来切换类型?

我会亲自在具有多个视图的单个控制器中执行此操作,并将类型作为参数传递:

// Reference Types
public class ReferenceTypesController : Controller
{
    public ActionResult() CustomerIndex()
    {
        return Index<Customer>();
    }

    public ActionResult() OrderIndex()
    {
        return Index<Order>();
    }

    public ActionResult Index<ReferenceType>()
    {
        ViewBag.Header = DisplayNamePlural;
        return View("~/Views/ReferenceItems/Index.cshtml"
            , db.ReferenceItems.OfType<ReferenceType>().ToList()
                .OrderBy(o => o.DisplayOrder)
                .ThenBy(o => o.Name));
    }

}

【讨论】:

  • 我需要为此创建自定义路线图吗?它会是什么样子?谢谢。
  • 你不需要,你可以通过 ReferenceTypes/CustomerIndex 或 ReferenceTypes/OrderIndex 访问它
  • 看起来我需要在一个控制器与每种类型的视图之间进行选择,或者在每种类型的专用控制器中选择一组视图来为它们提供服务。由于会有很多不同的类型,我想我会坚持使用一组视图和专用控制器。不过,将其标记为答案,因为它确实向我展示了一种不同的解决方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多