【发布时间】: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