13

私の MVC アプリケーションには、従来の親子 (マスター詳細) 関係があります。

新しい親と子の両方を同じページに作成する単一のページが必要です。部分ビューを返し、子 HTML を親のビューに追加するアクションを追加しましたが、アクションで新しく作成された子を元の親に関連付ける方法がわかりません (つまり、追加する方法がわかりません)。親エンティティ内のこれらのエンティティのコレクションへの新しい子エンティティ)。

フォームを送信すると、アクションはコレクションに新しく作成された子を持つ親エンティティを取得する必要があると思います。

簡単に言うと、子エンティティを作成するアクションのコードと、子エンティティをその親コレクションに追加する方法を教えてください。

ここ (および他のサイト) で多くの投稿を読みましたが、例が見つかりませんでした。

アプリケーションは、MVC 4 と Entity Framework 5 を使用します。

コードサンプル (シンプルにするために一部のコードを削除しました)。モデルは Form (親) エンティティと FormField (子) エンティティです。

public partial class Form
{ 
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<FormField> FormFields { get; set; }
}

public partial class FormField
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int FormID { get; set; }
}

次の部分ビュー (_CreateFormField.cshtml) は、新しい FormField (子) を作成します。

@model FormField

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>FormField</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.FormID)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.FormID)
        @Html.ValidationMessageFor(model => model.FormID)
    </div>


</fieldset>
}

次のビュー (Create.cshtml) は、フォームを作成するビューです。

@model Form

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>Form</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

<div>
        @Html.ActionLink(
                "Add Field",
                "CreateFormField", 
                new { id = -1},
                new { @class = "form-field" })
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

<div id="CreateFormField"></div>

@section Scripts {
<script>
    $(function () {
        $('.form-field').on('click', function (e) {

            $.get($(this).prop('href'), function (response) {
                $('#CreateFormField').append(response)
            });

            e.preventDefault();
        });
    });
</script>

@Scripts.Render("~/bundles/jqueryval")

}

次のアクションは、FormController での作成を処理します。

[HttpPost]
public ActionResult Create(Form form)
{
    if (ModelState.IsValid)
    {
        db.Forms.Add(form);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(form);
}

public ActionResult CreateFormField(string id = null)
{
    // I guess something is missing here.

    return PartialView("_CreateFormField", new FormField());
}

前もって感謝します、

シャロン。

4

5 に答える 5

1

親 cshtml ページ内で @Html.RenderPartial(_CreateFormField.cshtml) htlper メソッドを使用できます。

モード情報については、 http://msdn.microsoft.com/en-us/library/dd492962( v=vs.118 ).aspx

疑似コードの例を提供していますが、

@Foreach(childModel in model.FormFields)
{
    @Html.RenderPartial("childView.cshtml","Name", childModel)
}

適切な c# 構文で試してみてください。コレクション アイテムごとにレンダリングされた部分ビューが得られます。

于 2014-12-15T12:41:21.270 に答える
1

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

フィールドセットには、作成用と編集用の 2 つの部分ビューが必要です。作成の部分ビューは次のようになります。

@model myPrj.Models.Form_FormFieldInfo

@{ 
    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.FormFieldID)
    </td>
    <td>
        @Html.DropDownList(ln + "[" + index + "].FormFieldID", 
            new SelectList(new myPrj.Models.DbContext().FormFields, "ID", "FieldName"))
    </td>        
    <td>
        <input type="button" onclick="$(this).parent().parent().remove();" 
            value="Remove" />
    </td>
</tr>

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

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

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

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

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

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

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

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

ここに完全な情報と方法があります。

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

于 2013-07-27T12:42:24.970 に答える
0

グリッド ベースのレイアウトを使用する場合は、剣道 UI グリッドを試してください。

于 2015-01-07T16:49:58.517 に答える
0

問題は、部分ビューで次を使用する必要があることです。

@model Form //Instead of FormField

部分ビュー内では、モデル => モデルを使用する必要があります。フォームフィールド .x

<div class="editor-label">
    @Html.LabelFor(model => model.FormField.Name)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.FormField.Name)
    @Html.ValidationMessageFor(model => model.FormField.Name)
</div>

これは 1 対 1 の関係でのみ機能します (または、このスレッドで読みました:ここ)。部分ビュー内に @Html.Form があるかどうかも問題ではありません。

これらの変更を行った後、投稿されたすべてのデータを問題なくコントローラーに戻すことができました。

編集:誰もがすぐに理解できるように、私はこれで問題に遭遇しました。

これを行うより良い方法 (私が見た) は、代わりに EditorTemplate を使用することです。このようにして、エディターは親から独立したままになり、FormField も追加しているページだけでなく、任意のページにフォームを追加できます。

次に、交換します

@Html.Partial("view")

@Html.EditorFor()

基本的に、編集時に部分ビューの代わりに @Html.EditorFor を使用する方がはるかに優れていることがわかりました (エディターではなくビューと呼ばれます)。

于 2013-06-06T17:22:21.970 に答える