1

長い間 Web フォームを扱った後、ASP.net MVC を学ぼうとしているので、混乱している場合は申し訳ありません。モデルごとの単純な編集ページ構造を超えて移動するのに苦労しています。プロジェクトに外部参照されている従業員がいて、これをすべて 1 つのページで編集したいと考えています。

私は従業員モデルを持っています:

public class Employee
{
    public string UserID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<ProjectXref> Projects { get; set; }
}

そして、これが私の ProjectXref モデルです。

public class ProjectXref
{
    public Project Project { get; set; }
    public string Role { get; set; }
}

ProjectXref のエディター テンプレートを作成しました。

@model Relationships.Models.ProjectXref

<tr>
    <td><span class="h3"> @Model.Project.ProjectName </span> </td>
    <td>@Html.EditorFor(model => model.Role)</td>
    <td>
        @Html.HiddenFor(model => model.Project.ProjectKey)
        <a class="btnDel" > </a>
    </td>
</tr>

...そして、Employee Edit ビューでは、EditorFor を使用して、従業員が関連付けられている各プロジェクトの tr 行をレンダリングします。

@Html.EditorFor(model => model.Projects)

私は今、これらをどうするかで立ち往生しています。ProjectXref を削除するために、いくつかの jQuery から始めました。

$(".btnDel").live("click", function () {
    $(this).parents('tr').remove();
    return false;
});

問題ないように見えますが、最初のプロジェクトを削除してから送信すると、次のプロジェクトが投稿に表示されません。私はそれが起こっている魔法の束縛に関係していると思います。私の「Projects_0__Title」フィールドが見つからないため、MVC は他のものをバインドしようとスキップします。

私の目標: プロジェクトのリストを自分のページで動的に変更したいと考えています。つまり、プロジェクトを削除したり、新しいプロジェクトを追加したり、プロジェクトを編集したり (プロジェクトに関連する従業員の役割を変更したり) したいと考えています。MVCにこれをさせようとするのは間違っていますか? 私が見たチュートリアルでは、ほとんどの場合、新しい ProjectXref をそれぞれ別のページで編集および追加する必要がありますが、それは UI が悪いように思えます。

私の考えでは、新しい ProjectXref エディター HTML をフォームに追加し、フォームが投稿されると、ASP.net がそれを新しい ProjectXref として認識し、バインドできるようになることを期待しています。同時に、既存の ProjectXref に関連付けられているフィールドを削除すると、ASP.net は ProjectXref の 1 つのフィールドが欠落していることを認識し、その ProjectXref を削除することを期待します。EditorTemplates で間違った道を進んでいますか?

編集:私の解決策

@Parv Sharma のおかげで、クラスに新しいプロパティを作成することになりました。

public string ProjectsJson
{
    get { return JsonConvert.SerializeObject(Projects); }
    set { Projects = JsonConvert.DeserializeObject<List<ProjectXref>>(value); }
}

次に、それを非表示としてビューに追加しました。

@Html.HiddenFor(model => model.ProjectsJson)

次に、AngularJS を使用して (とにかく学習する必要がありました)、フィールドから JSON を読み取り、それを UI に表示しました。

4

1 に答える 1

1

私がこれを達成した方法は、追加または削除され、コレクションの一部であるフィールドを追跡する隠しフィールドを保持することでした。
このようにして、コレクション内の要素を削除するたびに、JSON を更新するだけで済みます。それがポストバックされたら、json を読み取り、それに応じてコレクションを更新して、組み込みまたは
非シリアルJSON化を使用できます。JavaScriptSerializernewtonsoft.json

于 2013-02-24T08:25:38.380 に答える