我正在尝试创建一个 Controller 类来处理我将在未来最终创建的所有可预见的调查。目前,我有一个“调查”表,其中包含以下字段:Id、SurveyName、Active。在“主”调查索引页面上,我列出了在该表中找到的每个调查名称。每个 SurveyName 都是可单击的,当单击时,页面会将 SurveyName 作为字符串发送到接收控制器操作。所述控制器动作如下所示:
//
//GET: /Surveys/TakeSurvey/
public ActionResult TakeSurvey(string surveyName)
{
Assembly thisAssembly = Assembly.GetExecutingAssembly();
Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == surveyName).First();
object newSurvey = Activator.CreateInstance(typeToCreate);
ViewBag.surveyName = surveyName;
return View(surveyName, newSurvey);
}
使用反射,我能够创建由传入字符串“surveyName”指定的类型(模型)的新实例,并且能够将该模型传递给具有相同名称的视图。
示例
有人点击“SummerPicnic”,字符串“SummerPicnic”被传递给控制器。控制器使用反射创建 SummerPicnic 类的新实例并将其传递给具有相同名称的视图。然后,一个人可以为他们的夏季野餐计划填写表格。
这一切都很好,花花公子。我坚持的部分是尝试将 POST 方法传回的表单保存到正确的相应数据库表中。由于我不提前知道控制器将返回哪种模型,所以我不仅不知道如何告诉它要保存哪种模型,而且也不知道将它保存到哪里,因为我可以不要做一些荒谬的事情,比如:
//
//POST: Surveys/TakeSurvey
[HttpPost]
public ActionResult TakeSurvey(Model survey)
{
if (ModelState.IsValid)
{
_db. + typeof(survey) + .Add(survey);
_db.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View();
}
有没有办法做到这一点,或者我应该从一个完全不同的角度来解决这个问题?我的最终目标是让一个控制器编排每个简单的调查,因此我不必为我最终进行的每个调查创建一个单独的控制器。
我能想到的另一种解决方案是为每个调查设置一个单独的方法,并在每个调查的视图中定义要调用的方法。例如,如果我有一个 SummerPicnic 调查,提交按钮将调用一个名为“SummerPicnic”的 ActionMethod:
@Ajax.ActionLink("Create", "SummerPicnic", "Surveys", new AjaxOptions { HttpMethod = "POST" })
对 PartyAttendance 的调查将调用 ActionMethod 'PartyAttendance' 等。不过,我宁愿不必这样做......
更新 1 当我打电话时:
_db.Articles.Add(article);
_db.SaveChanges();
这就是 _ db是:
private IntranetDb _db = new IntranetDb();
哪个是...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace Intranet.Models
{
public class IntranetDb : DbContext
{
public DbSet<Article> Articles { get; set; }
public DbSet<ScrollingNews> ScrollingNews { get; set; }
public DbSet<Survey> Surveys { get; set; }
public DbSet<Surveys.test> tests { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
}