6

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);
    }

さらにコードが役立つかどうか教えてください。

4

2 に答える 2

3

私はあなたが何をしようとしているのかについて少し混乱していますが、いくつかの変更を提案したいと思います:

私はこれを変更します:

<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>

これに:

<div class="editor-label">
    @Html.LabelFor(model => model.SetID, "Set")
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.SetID, (SelectList)ViewBag.FranchiseSets)
    @Html.ValidationMessageFor(model => model.SetID)
</div>

SetID値をCreateActionMethodに渡して割り当てると、ビューに渡されるはずです。DropDownListにデータを入力していないように見えるため、選択リストに選択するオプションはありません。

public ActionResult Create(int SetID)
{
    ViewBag.FranchiseSets = new SelectList(...);
    var franchise = new Franchise { SetID = SetID };
    return View(franchise);
}
于 2012-06-21T20:57:12.030 に答える
1

アクションとルートがどのように設定されているかは正確にはわかりませんが、これを試してみてください:

@Html.ActionLink("New Franchise", "Create", "Franchise", new{Model.SetID},  new { @class = "btn btn-large btn-primary" })

プロパティを持つオブジェクトを作成することによりSetID、MVC は、パラメーターの名前が "SetID" であることを認識します。

PS-名前の衝突を避けるために、名前Setを ( FranchiseSet、またはなど) に変更することをお勧めしますか? は、英語で最も曖昧で一般的な単語の 1 つです。FranchiseGroupSet

于 2012-06-21T17:59:25.930 に答える