如何在asp.net mvc4中制作具有通用参数的通用基控制器

本文关键字:参数 控制器 asp net mvc4 | 更新日期: 2023-09-27 17:49:53

我遇到了如何制作通用控制器的问题。我有模型id属性可以是字符串或int类型。当我想编辑id为int的模型时,我找不到导致错误的动作,因为我实现了

一个覆盖方法,以公共抽象ActionResult编辑(字符串id)。

存在一种方法来传递一个通用参数(字符串或int),我的路由可以理解?

public abstract class BaseController<T> : Controller
{
    //protected UnitOfWork unitOfWork = new           UnitOfWork(System.Web.HttpContext.Current.User.Identity.Name);        
    protected UnitOfWork unitOfWork = new UnitOfWork("");
    public abstract ActionResult List();
    public abstract ActionResult Index();
    public abstract ActionResult Details(string id);, 
    public abstract ActionResult CreateByModal();
    public abstract ActionResult Create();
    [HttpPost]
    [ValidateAntiForgeryToken]
    public abstract ActionResult Create(T entity);
    public abstract ActionResult Edit(string id);
    [HttpPost]
    [ValidateAntiForgeryToken]
    public abstract ActionResult Edit(T entity);       
    public abstract ActionResult Delete(string id);
    protected override void Dispose(bool disposing)
    {
        //db.Dispose();
        base.Dispose(disposing);
    }
}
 public class ModeloController : BaseController<Modelo>
{
    public override ActionResult Edit(string id)
    {
       //Here i have a int Id im my Model  and the error in my route
        Modelo modelo = unitOfWork.ModeloRepository.Find(id);
        if (modelo == null)
        {
            return HttpNotFound();
        }
        return PartialView("_Edit", modelo);
    }
}

public class GeneroController : BaseController<Genero>
{
    //Here i have a string Id im my Model 
    public override ActionResult Edit(string id)
    {
        Genero genero = unitOfWork.GeneroRepository.Find(id);
        if (genero == null)
        {
            return HttpNotFound();
        }
        return PartialView("_Edit", genero);
    }

}

如何在asp.net mvc4中制作具有通用参数的通用基控制器

一个选择是重载每个将id作为参数的方法:

public abstract ActionResult Details(string id);
public abstract ActionResult Details(int id); 

或者为id类型添加第二个泛型参数:

public abstract class BaseController<T, U> : Controller
{
    public abstract ActionResult Details(U id);
    public abstract ActionResult Edit(U id);
无论哪种方式,您都将更多的责任放在调用者上,以确保使用正确的类型。

您可以添加一个额外的泛型类型参数来指示给定类的键类型。

public abstract class AbstractController<TEntity, TId> : Controller
{
    // irrelevant stuff omitted
    public ActionResult Edit(TEntity id);
}