0

私はSOとGoogleを1週間以上探してきましたが、まだ有効な答えを見つけることができませんでした. うまくいけば、誰かが私を助けることができます。

asp.net (Entity Framework + Razor) を使用してプロジェクトに取り組んでおり、ビューに 2 つのモデルを追加しようとしています。editorFor() を使用して、完全に表示されています。問題は、一部の部分が情報をコントローラーに渡していないことです。

この場合、すべての演習でいくつかの答えが得られました。これは私の運動モデルです:

Table("Exercise")]
public class ExerciseModel
{

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

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

    [Required]
    public List<AnswerModel> Answers { get; set; }

そして、これが回答モデルです:

[Table("Answer")]
public class AnswerModel
{
    [Key]
    public int AnswerId { get; set; }

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

ビューは、演習部分 (作業部分) と回答部分の 2 つの部分から構成されます。エクササイズモデルのリストにさらに回答を追加したいと思います。私はさまざまな方法を試しました。エディター テンプレート、部分ビューなど。

これがビューです。Jquery を使用して、外出先で新しい質問を作成し、回答を追加できます。私が作成したいのは、エクササイズモデルのそのリストに回答を投稿できることです。

@using (Html.BeginForm("CreateQuestion", "Admin", FormMethod.Post))
{
@Html.ValidationSummary(true)

//will be changed
@Html.Partial("_PartialCreateExercise")

//this shows the answers form
<div style="display: none;" id="new">
    <div class="editor-field">
            @Html.EditorFor(m => m.Answers);
    </div>
</div>



<p>
    <input name="command" type="button" id="add" value="add new answers" />
</p>
<p>
    <input name="command" type="submit" value="Create" />
</p>
}

これは機能しますが、ページを送信すると、(AnswerModel タイプの)exercisemodel のリストは空のままです。最後に、回答用のエディター テンプレート:

@model Academy.Models.AnswerModel
@{
Layout = null;
}


<h2>Answer</h2>
<p>
    @Html.LabelFor(model => model.Answer)
    @Html.EditorFor(model => model.Answer)
</p>



The jQuery:
$(document).ready(function () {
    $("#add").click(function () {
        $('#add').after($("#new").html());
        $('#new').css("Display", "block");
    });
});

あまり効果がなく、いろいろ試したので、ぐちゃぐちゃになりました。しかし、デバッグ モードを使用すると、ExerciseModel の List は空になり、AnswerModel も空になります。

繰り返しますが、問題は、フォームを投稿するときに、ExerciseModel の List が空のままであることです。何らかの理由で、エディター テンプレートを使用してエクササイズ モデルのリストにアクセスできません。(コントローラーは現在あまり機能しておらず、リストは常に空であるため、含まれていません)

これで一週間忙しくしています。誰か助けていただけませんか?

4

1 に答える 1

1

原因は、新しい回答を動的に追加することになっている jQuery コードにあると思われます。あなたはそれを示していないので、何が問題なのかを判断するのは困難です.

注意すべきことは、入力フィールドの命名規則です。Phil Haack はhis blog postこの大会で説明しました。

基本的に、新しい要素を動的に追加する方法は 2 つあります (#btnaddクリックされたとき)。

  1. 空のテンプレートを含む部分ビューを返すコントローラー アクションに AJAX 呼び出しを送信します。命名規則をもう一度尊重する必要があります。ここでの難しさは、索引にあります。命名規則では非連続インデックスを使用できるため (Phil Haack のブログ記事をもう一度読んでください)、最も簡単なのは Guid をインデックスとして使用することです。Steven Sanderson は、この概念を説明し、まさにそれをhis blog post行うカスタムHtml.BeginCollectionItemヘルパーを示しました。

  2. 純粋にクライアント側で行います。たとえば、knockoutjs などのフレームワークを使用できます。もう一度スティーブン・サンダーソンがこの概念をhis blog post.

したがって、基本的には、好みのアプローチを選択するのはあなた次第です。しかし、Answers 入力フィールドの命名規則を尊重していない場合、フォームの送信時にどのアプローチを選択しても、コントローラー アクションで得られるのは null だけです。

于 2013-04-02T12:19:13.063 に答える