我有很多具有相同格式的模型(如以下模型,只有Id和Name属性),所有这些模型都继承自实体模型。
public abstract class Entity
{
public int Id { get; set; }
}
public class Exapmle1 : Entity
{
public string Name { get; set; }
}
public class Exapmle2 : Entity
{
public string Name { get; set; }
}
public class Exapmle3 : Entity
{
public string Name { get; set; }
}
我不想在CRUD操作中为每个模型实现 几个控制器和对应视图 。 有没有办法让最低限度的实施? 例如,对于使用相同格式模型的所有已实现控制器,只有一个索引视图(列表)。
答案 0 :(得分:1)
最后,我发现通用控制器和共享视图的组合是最佳方式。在这种情况下,也可以单独为每个控制器进行身份验证。
通用控制器:
public abstract class GenericController<T> : Controller
where T : BaseInformation
{ //Controller Implementation for Index, Create, Edit, Delete }
共享文件夹中的查看
@model BaseInformation
//Model Implementation
最终控制器
[Authorize(Roles = "Admin")]
public class Base1Controller : GenericController<Base1>
{
}
[Authorize(Roles = "Helpdesk")]
public class Base2Controller : GenericController<Base2>
{
}
答案 1 :(得分:0)
您可以使用具有动态视图模型的视图和接受实体(您的基类)的控制器操作。它可能看起来像这样
控制器:
public ActionResult Index(Entity foo)
{
if(foo is Example1)
{
var e1 = foo as Example1;
//do your stuff
}
return View();
}
查看:
@model dynamic
@{
ViewBag.Title = "IndexNotStonglyTyped";
}
<h2>Index Not Stongly Typed</h2>
<p>
<label>@Model.Name</label>
<label>@Model.Id</label>
</p>
答案 2 :(得分:0)
当您拥有密切相关的实体组(或任何其他对象)时,可以很好地工作的一种方法是将它们拆分为可组合的接口,例如:
public interface IIdIdentity
{
int Id { get; set; }
}
public interface INameIdentity
{
int Name { get; set; }
}
public interface IYourGroup : IIdIdentity, INameIdentity
{
}
public class Exapmle1 : IYourGroup
{
public int Id { get; set; }
public int Name { get; set; }
}
然后,您的视图可以接受IYourGroup
类型的任何实体,只要您的域实体满足界面。