私は、将来的に作成する予見可能なすべての調査を処理するために、単一の Controller クラスを作成しようとしています。現在、フィールドを持つ「Surveys」テーブルがあります:Id、SurveyName、Active。「マスター」Surveys のインデックス ページで、そのテーブルで見つかったすべての SurveyName を一覧表示します。各 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 メソッドによって返されたフォームを正しい対応する DB テーブルに保存しようとしていることです。コントローラーがどのようなモデルを取得するかを前もって知らないので、どのようなモデルを保存するかを伝える方法がわからないだけでなく、保存先もわかりません。次のようなばかげたことをしないでください。
//
//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' などと呼びます。しかし、そうする必要はありません...
UPDATE 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>();
}
}
}