1

私はモデル(コードファースト)とデータベース(SQL Server)のセットアップを多対多の関係とシードでうまくやっています:

場所には多くのタグ (レストラン、バー、カフェなど) を付けることができ、タグは多くの場所に属することができます。

Place
[ScaffoldColumn(false)]
public virtual int PlaceID { get; set; }

[Required(ErrorMessage = "Place Name is required")]
[StringLength(100)]
public virtual string Name { get; set; }

[Required]
public virtual string Address {get;set;}

public virtual string ImageLogo {get;set;}
public virtual string ImageBackground {get;set;}


Tag
public virtual int TagID { get; set; }

[Required]
public virtual string Name { get; set; }

[Required]
public virtual string NamePlural { get; set; }

public virtual ICollection<Place> Places { get; set; }

EF Migrations は、TagID と PlaceID を使用してジャンクション テーブルを生成し、Seed メソッドで複数のタグを使用して Places を追加できます。約 50 個のタグがあり、すべてシードされています。

私がやりたいのは、ユーザーがすべてのタグから選択できるビュー フォームを作成することです。これはモデルとともに保存されます。

このデータは管理者によって入力されます - 入力の速度が最も重要です (100% ばかである必要はありません)。

また、場所を編集できるようにする必要があります。これらのタグを適切に表示して、削除したり、他のタグを追加したりできます。

また、場所の削除を処理する最良の方法-最初にジャンクションテーブルのレコードを削除しますか?

上記のすべてにおけるベストプラクティスは何ですか?

ありがとう。

4

1 に答える 1

1

あなたにとって最善かつ最も簡単な方法は、作成するためのビューがPlaceあり、その下部にfieldsetタグを割り当てることです。

フィールドセットの場合、2 つの部分ビューを作成する必要があります。1 つは作成用、もう 1 つは編集用です。作成するための部分ビューは次のようになります。

@model myPrj.Models.PlaceTagInfo

@{ 
    var index = Guid.NewGuid().ToString(); 
    string ln = (string)ViewBag.ListName;
    string hn = ln + ".Index";
}

<tr>
    <td>        
        <input type="hidden" name="@hn" value="@index" />
        @Html.LabelFor(model => model.TagID)
    </td>
    <td>
        @Html.DropDownList(ln + "[" + index + "].TagID", 
            new SelectList(new myPrj.Models.DbContext().Tags, "ID", "TagName"))
    </td>        
    <td>
        <input type="button" onclick="$(this).parent().parent().remove();" 
            value="Remove" />
    </td>
</tr>

create place ビューでこの部分ビューを ajaxly で呼び出すことにより、タグごとにいくつかの要素をレンダリングできます。要素の各行には、ラベル、タグを含む DropDownList、および作成された要素を単純に削除するための削除ボタンが含まれています。

create place ビューには、部分ビューで作成した要素を含む裸のテーブルがあります。

<fieldset>
     <legend>Place Tags</legend>
     @Html.ValidationMessageFor(model => model.Tags)</label>
     <table id="tblTags"></table>                                        
     <input type="button" id="btnAddTag" value="Add new tag"/>
     <img id="imgSpinnerl" src="~/Images/indicator-blue.gif" style="display:none;" />
</fieldset>

また、各タグの要素の行を作成する次のスクリプトがあります。

$(document).ready(function () {
    $("#btnAddTag").click(function () {
        $.ajax({
            url: "/Controller/GetPlaceTagRow/Tags",
            type: 'GET', dataType: 'json',
            success: function (data, textStatus, jqXHR) {
                $("#tblTags").append(jqXHR.responseText);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                $("#tblTags").append(jqXHR.responseText);
            },
            beforeSend: function () { $("#imgSpinnerl").show(); },
            complete: function () { $("#imgSpinnerl").hide(); }
        });
    });
});

アクションメソッドGetPlaceTagRowは次のようになります。

public PartialViewResult GetPlaceTagRow(string id = "")
    {            
        ViewBag.ListName = id;
        return PartialView("_CoursePostPartial");
    }

作成は完了です...質問のソリューション全体には、ビュー、部分ビュー、コントローラー、ajax呼び出し、およびモデルバインディング用の多くのコードがあります。この回答にすべてを投稿することは本当にできないので、私はあなたに道を示しようとしました。

この回答がお役に立てば幸いです。

于 2013-07-25T06:35:00.367 に答える