Railsのバックグラウンドからasp.netMVC4にアクセスしていますが、ネストされたモデルの処理方法を理解するのに問題があります。
CodeFirstアプローチでEntityFramework4.3を使用しています。
アプリケーションはかなりシンプルで、多くのフランチャイズを持つSetモデルがあります。そしてそれはフランチャイズモデルを持っています-それはセットに属しています。
POCOクラスは、適切なナビゲーションプロパティとともに作成され、次にビューを使用してコントローラーをスキャフォールディングし、データベースを生成しました。
クラスは次のとおりです。
セットする
namespace FranchiseManagerTest.Models
{
public class Set
{
[Key]
public int SetID { get; set; }
public string SetName { get; set; }
public string MainAddress { get; set; }
public string TimeZone { get; set; }
public virtual ICollection<Franchise> Franchises { get; set; }
}
}
フランチャイズ
namespace FranchiseManagerTest.Models
{
public class Franchise
{
[Key]
public int FranchiseID { get; set; }
public int SetID { get; set; }
public string FranchiseName { get; set; }
public string FranchiseNumber { get; set; }
public virtual Set Set { get; set; }
}
}
次に、いくつかのテストフランチャイズセットとフランチャイズを作成しました。
主なビューは次のとおりです。
プロジェクトでは、セットに関連するすべてのフランチャイズが対応するセット内に表示される必要があります。また、セットの詳細を表示しているときに、フランチャイズをセットに追加できる必要があります。
メインビューの[詳細]をクリックした後のスクリーンショットを作成しました。
[新しいフランチャイズ]ボタンは、次のようなActionLinkで作成されます。
@Html.ActionLink("New Franchise", "Create", "Franchise", null, new { @class = "btn btn-large btn-primary" })
これにより、次のようなフランチャイズ作成ページに移動します。
ご覧のとおり、問題は、関連するセットモデルを含むドロップダウンが事前に入力されていないことです。代わりに、ドロップダウンをクリックして、既に存在するセットを再度選択する必要があります。
ドロップダウンは、私が入っているセットではなく、既存のすべてのセットによって入力されています。
クリックしたときのドロップダウンは次のとおりです。
フランチャイズ作成ビューの内部では、次のようになります。ドロップダウンとそのラベルは次のようになります。
<div class="editor-label">
@Html.LabelFor(model => model.SetID, "Set")
</div>
<div class="editor-field">
@Html.DropDownList("SetID", String.Empty)
@Html.ValidationMessageFor(model => model.SetID)
</div>
これが私が試したことです:
ActionLinkを使用して、 SetID値をビューに渡そうとしました。
@Html.ActionLink("New Franchise", "Create", "Franchise", Model.SetID, new { @class = "btn btn-large btn-primary" })
次に、CreateViewのString.Empty属性を次のように変更しようとしました。
<div class="editor-label">
@Html.LabelFor(model => model.SetID, "Set")
</div>
<div class="editor-field">
@Html.DropDownList("SetID", Model.SetID)
@Html.ValidationMessageFor(model => model.SetID)
</div>
ただし、これは機能せず、無効な引数エラーが生成されました。
ここに考えられる手がかり(または別の問題?)があります
私が所属している関連セットからフランチャイズビューの作成にアクセスすると、URLは次のようになります。
セットとフランチャイズの関連付けが正しい場合、セット内にフランチャイズを追加すると、URLは次のようになります。
localhost:52987/Set/1/Franchise/Create
これは間違った仮定ですか?これは.NET MVCで行うことができますか?
ここでのアドバイスは大歓迎です!
編集
これが役立つ場合は、Global.asaxファイルのルートを次に示します。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Set", action = "Index", id = UrlParameter.Optional }
);
}
要求に応じて-フランチャイズコントローラーのGETメソッドとPOSTCreateメソッドの両方を次に示します。
//
// GET: /Franchise/Create
public ActionResult Create()
{
ViewBag.SetID = new SelectList(db.Sets, "SetID", "SetName");
return View();
}
//
// POST: /Franchise/Create
[HttpPost]
public ActionResult Create(Franchise franchise)
{
if (ModelState.IsValid)
{
db.Franchises.Add(franchise);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.SetID = new SelectList(db.Sets, "SetID", "SetName", franchise.SetID);
return View(franchise);
}
さらにコードが役立つかどうか教えてください。