C#MVC 4-从单个控制器动作动态调用模型

本文关键字:动态 调用 模型 控制器 单个 C#MVC | 更新日期: 2023-09-27 18:26:47

我有一个Admin控制器,它需要从大约多个不同的模型中删除UID。我可以通过传递字符串来选择模型吗?下面是一个示例我想做的控制器操作(当然这不起作用):

private ModelEntities db = new ModelEntities();
public ActionResult ConfirmDelete(String ModelNameString, Int32 id)
{
    ModelNameString data = db.ModelNameString.Find(id);
    return View(data);
}

有没有其他方法可以将所有型号的标准任务组合成一个控制器动作?非常感谢。

C#MVC 4-从单个控制器动作动态调用模型

如前所述,实现一个接口(例如IDynamicTable)并使用映射文件执行数据操作(例如Delete)?

示例:当您调用YourObject.Delete()时,您可以检查YourObjectType。你可以在你的Action:中做这样的事情

public ActionResult ConfirmDelete(IDynamicTable obj)
{
   // ...
   if (obj is Company)
   {
      // Delete in company table
      return View("Company");
   }
   if (obj is User)
   {
      // Delete in user table
      return View("User");
   }
   // ... 
}

别忘了ASP.Net MVC不是PHP+Zend。

如果您担心在删除主引用后留下其他实体,则应该考虑执行级联删除。这意味着,当您删除带有主键的主对象时,它将删除引用该主键的所有其他对象。

如果您有一个一对多的必需关系,您可以这样做,让您的对象执行级联删除。您可以在模型中的所需关系上添加[Required]属性,以便实体框架知道该关系是必需的,也可以使用Fluent API。

public class Product
{
    public Guid ProductId { get; set; }
    [Required]
    public Category Category { get; set; }
}

流利的API

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().HasRequired(p => p.Category).WithMany();
}

如果你的关系是可选的,但你想级联删除,你可以这样做:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().HasOptional(p => p.Category).WithMany().WillCascadeOnDelete(true);
}