对具有相似模型的控制器操作使用相同视图

时间:2015-03-11 13:21:27

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

我有很多具有相同格式的模型(如以下模型,只有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操作中为每个模型实现 几个控制器和对应视图 。 有没有办法让最低限度的实施? 例如,对于使用相同格式模型的所有已实现控制器,只有一个索引视图(列表)。

3 个答案:

答案 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类型的任何实体,只要您的域实体满足界面。