4

ASP.NET MVC に関するいくつかのチュートリアル (ここここ) を試してみて、自分でいくつかのことを試すことにしました。Resumeこれで、 、Descriptions、 の3 つのテーブルができましたSubDescriptions。3つのコードは次のとおりです。

public class Resume
{
    public Resume()
    {
        Descriptions = new List<Description>();
    }

    [Key]
    public int ResumeId { get; set; }

    [Required]
    public string Employer { get; set; }

    [DataType(DataType.Date)]
    public DateTime StartDate { get; set; }

    [DataType(DataType.Date)]
    public DateTime EndDate { get; set; }

    [Required]
    public string Location { get; set; }

    [Required]
    public virtual ICollection<Description> Descriptions { get; set; }
}

public class Description
{
    public Description()
    {
        SubDescriptions = new List<SubDescription>();
    }

    [Key]
    public int DescriptionId { get; set; }

    [ForeignKey("Resume")]
    public int ResumeId { get; set; }

    [Required]
    public string Desc { get; set; }

    public virtual Resume Resume { get; set; }

    public virtual ICollection<SubDescription> SubDescriptions { get; set; }
}

public class SubDescription
{
    [Key]
    public int SubDescriptionId { get; set; }

    [ForeignKey("Description")]
    public int DescriptionId { get; set; }

    [Required]
    public string Sub { get; set; }

    public virtual Description Description { get; set; }
}

今、私が抱えている問題はCreateビューにあります。Resume新しいエントリを作成したいと思います。ただし、追加で問題が発生していDescriptionsます。これが私のCreate見解です:

@model Portfolio.Models.Resume

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

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

    <fieldset>
        <legend>Resume</legend>

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

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

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

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

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

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

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

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

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

問題は、Descriptionsはリストであるため、実際に追加するものは何も表示されないことです。私はこれについて行く方法についてさえ確信が持てません。を追加できるようにしたいのですが、事後Descriptionに追加することを選択できSubDescriptionます。これは可能ですか、それとも完全に複雑なことを試みていますか?

編集

もう少し明確にするために、この編集を追加します。Descriptionsユーザーがビューのリストにデータを入力する方法を決定しようとしていCreateます。私はこれに alistboxを使用することを考えていました。次に、 を選択してDescriptionを追加できますSubDescription。しかし、私はそれを行う方法について100%確信が持てません。を に変更しようとしました@Html.EditorFor(model => model.Descriptions)@Html.ListBoxFor(model => model.Descriptions)、エラーが発生しましたno overload for ListBoxFor takes 1 argument.。私はまだ新しく、これを学んでいるので、やりたいことを達成する方法がわかりません。

4

2 に答える 2

1

あなたは正しい軌道に乗っていました!このListBoxForメソッドは 2 つのパラメーターを取ります。1つ目は、現在持っているものです。2 番目のパラメーターはIEnumerable<SelectListItem>オブジェクトです。

私は以前にこの種のことを個人的にやったことがあり、その方法を使用することは本当に役に立ちましたListBoxFor. を作成できList<SelectListItem>、各アイテムは Descriptions オブジェクトに格納された情報を保持できます。

オブジェクトをコントローラーからビューに渡すと、List<SelectListItem>すべての説明オブジェクトをユーザーに表示でき、ユーザーは選択したものを選択して追加できます。

また、別のビューを作成し、目的に応じて特定の状況でユーザーをそれらのビューにリダイレクトすることもできます。

幸運を!=)

于 2013-11-12T01:59:33.633 に答える
1

@RobG31415 はかなり良い答えをくれましたが、ListBoxFor と DropDownListFor を初めて使用するのは本当に苦痛だったので、もう少し詳しく説明します。

履歴書の作成

ビューモデルまたはモデルを、説明のみを含むビューに渡すことができます。SubDescriptions は選択した説明に依存するため、カスケード ドロップダウンが必要です。

次の行に沿って説明のドロップダウン リストを作成します。

@Html.DropDownListFor(x => x.DescriptionId, new SelectList(Model.Descriptions.Select(m => new SelectListItem()
{
    Text = m.Desc,
    Value = m.DescriptionId.ToString()
})), "Choose", new { id = "Descriptions" })

その後、サブの説明用に空のドロップダウンリストを追加します

@Html.DropDownList("SubDescriptionId", new SelectList(new List<SelectListItem>()), new { id = "SubDescriptions" })

DropDownListFor の最初の式は、ドロップダウンから選択された値を格納するためのモデル プロパティを指しており、それが DescriptionId になります。ここで、jquery と ajax を使用してカスケード ドロップダウン効果を作成する必要があります。Descriptions ドロップダウンに onchange イベントを追加して、データベースからすべての SubDescriptions を取得します。

$('#Descriptions').change(function() {
    var descId = $('#Descriptions:selected').val();
    $.ajax({
        type: 'GET',
        url: '/Resume/GetSubDescriptions'
        data: { id = descId },
        success: function(data) {
            //TODO: Add SubDescriptions to the dropdown
        }
    });
});

ディスクリプション/サブディスクリプションの作成

これは履歴書を作成するためのほんの一部です。ユーザーが独自の説明を作成できるようにする必要がある場合は、ドロップダウンに「説明を作成」というボタンまたはオプションと、サブ説明用のオプションが必要だと思います。これにより、上部に新しいウィンドウが開いたり、非表示の div を下にスライドしたり、思いついたことが何でもできます。この部分は、部分ビューまたは元のビューの一部として実行できます。
Description から始めて、これは文字列のみを必要とするため、通常の Html.TextBox とそれを保存するためのボタンは、おそらく今のところ必要なものすべてであるはずです。ユーザーがテキストボックスに入力して保存を押した後、ajax を使用して文字列をコントローラーに送信し、作成された説明を返すようにします。

$('#createDescription').click(function() {
    var desc = $('#newDescription').val();
    $.ajax({
        type: 'POST',
        url: '/Resume/CreateDescription'
        data: { desc = desc },
        success: function(data) {
            //TODO: Add the returned description to the drop-downs
        }
    });
});

public JsonResult CreateDescription(string desc)
{
    Description description = _resumeService.CreateDescription(desc);
    return Json(description);
}

SubDescription を作成するには、最初に説明を選択してから名前を選択する必要があるため、これは同じように見えますが、以前に示したすべての説明を含むドロップダウンと、名前のテキストボックスを使用して、これら 2 つを投稿します。コントローラへの値。

考慮すべき事項:

履歴書を作成するのと同じフォームで Description と SubDescription を作成する際の問題は、新しいものを作成するたびにページ全体をリロードしたくないということです。これにより、ドロップダウンなどを正しいデータで更新し続けるために、大量の javascript/jQuery が簡単に作成されます。フォーム全体を送信してページをリロードすると、ドロップダウンに適切なデータを簡単に表示できますが、サイトの専門性が低下します。

サイドノート:

私が最初に行うことは、実際のモデルを使用する代わりに ViewModel を設定することです。ビューにはおそらく検証とさまざまなデータ セットが必要になるため、モデルを乱雑にせずに実現する最善の方法は、ViewModelsを使用することです。ビューモデルを使いやすくするために、 Automapperを使用してモデルからビューモデルにデータをマップし、その逆にデータをマップするのが好きです。必要に応じて、ビューモデルから他のビューモデルにデータをマップすることもできます。

于 2013-11-14T02:28:28.373 に答える