1

現在、ASP.NET MVC 2 プロジェクトでマスター/詳細ページを作成する際に問題が発生しています。このプロジェクトでは、テーブル マッピングに Entity Framework OR/M を使用します。オブジェクトの別のリストを渡すカスタムCategoryModelを使用しています。プレゼンテーションのためにモデルを単純化しました。

    public class CategoryModel {
    public Category Category { get; set; }
    public IEnumerable<CategoryDescription> CategoryDescriptions { get; set; }
    }

CategoryDe​​scriptionは、各Categoryの「カルチャ言語ベース」の説明のコレクションです。

CategoryModelをコントローラーに渡しています [繰り返しますが、コントローラーのEditメソッドはプレゼンテーションのために簡略化されています] :

        // CategoryModel constructor
        CategoryModel categoryModel = new CategoryModel()
        {
            Category = (from c in bo.Categories where c.CategoryID == categoryId select c) as Category,
            CategoryDescriptions = bo.CategoryDescriptions.Where(p => p.CategoryID == categoryId).OrderBy(p => p.Language == "en")
        };
        return View(categoryModel);

その後、データをビューに送信します。ビューは、CategoryDe ​​scriptionごとにPartialViewをレンダリングしようとします。これは私が失敗する場所です[ビューの一部のみが表示され、Categoryオブジェクトを表示する部分は問題ありません] :

        <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<InnVue.Globe.Models.CategoryModel>" %>
    <%@ Import Namespace="InnVue.Globe.Models" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        <%: ViewContext.RouteData.Values["Action"] %> Category
    </asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2><%: ViewContext.RouteData.Values["Action"] %> Category</h2>

    <% Html.EnableClientValidation(); %>
    <% using (Html.BeginForm()) {%>
        <%: Html.ValidationSummary(true) %>

        <fieldset>
            <legend>CategoryDescription</legend>
            <% foreach (var catdes in Model.CategoryDescriptions) { %>
                <% Html.RenderPartial("CategoryDescriptions", catdes); %>
            <% } %>
            <% Html.RenderPartial("CategoryDescriptions", Model.CategoryDescriptions, new ViewDataDictionary()); %>
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    <% } %>

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

</asp:Content>

私が今抱えている問題は、RenderPartialメソッドに起因します。このメソッドは、データを渡そうとするたびにアプリケーションをクラッシュさせます。

Inherits タグをいくつかのタイプに変更しようとしましたが、問題は解決していないようです。RenderPartial htmlhelperメソッドを使用してデータを渡さなければ、ページは問題なく読み込まれます。

フォーラム ボードでいくつかの提案を試みましたが、この問題を解決する答えが見つかりませんでした。ここでPartialViewのデータを取得するための唯一の制限は、多くの明白な理由から、私の会社のViewData [] 辞書を使用しないことです。

お時間をいただきありがとうございます。私の英語で申し訳ありません。私はカナダ出身のフランス語を母国語としています。

EDIT 01/10 : ループの外側にRenderPartialが 1 つある理由は、説明コンテンツを追加するための新しい入力ボックスのためですが、コントローラーのポストバック編集メソッドにはこれを処理するロジックがあります。ループ内のRenderPartialは、ユーザーがそのカテゴリの既存の説明を編集できるようにするためにあります。ループを機能させることがここでの鍵です。私はテスト目的でスキャフォールディングされたPartialViewを作成しただけで、空の "

こんにちは世界

" PartialViewにデータを渡す場合。どのクラスを継承すべきかわからない場合でも、 PartialViewのコードを追加します。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<InnVue.Globe.Models.CategoryModel>" %>

<% using (Html.BeginForm()) {%>
    <%: Html.ValidationSummary(true) %>

    <fieldset>
        <legend>Fields</legend>
        <p>Hello World !</p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

<div>
    <%: Html.ActionLink("Back to List", "Index") %>
</div>
4

2 に答える 2

1

同じ render 部分メソッドを 2 回呼び出しているようです。1 回はデータ型CategoryDescriptionで渡し、もう 1 回は type でモデルを渡しIEnumerable<CategoryDescription>ます。ビューの正しいデータ型を渡さないものをコメントアウトしようとしましたか?

次のようなことを試してください:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<InnVue.Globe.Models.CategoryModel>" %>
    <%@ Import Namespace="InnVue.Globe.Models" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        <%: ViewContext.RouteData.Values["Action"] %> Category
    </asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2><%: ViewContext.RouteData.Values["Action"] %> Category</h2>

    <% Html.EnableClientValidation(); %>
    <% using (Html.BeginForm()) {%>
        <%: Html.ValidationSummary(true) %>

        <fieldset>
            <legend>CategoryDescription</legend>
            <% foreach (var catdes in Model.CategoryDescriptions) { %>
                <% Html.RenderPartial("CategoryDescriptions", catdes); %>
            <% } %>

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

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

</asp:Content>

これを部分ビューとして使用します。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<InnVue.Globe.Models.CategoryModel>" %>

<%: Html.EditorFor(m => m) %>
于 2010-10-01T21:06:44.773 に答える
0

助けてくれたニックラーセンに感謝します。あなたのコメントは、私が間違っていたことを理解するのに役立ちました。

私の部分的なビューの継承が問題の原因でした。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<InnVue.Globe.Models.CategoryDescription>" %>

が私の問題の解決策でした。強く型付けされたビューをよく理解していなかったので、あてもなくさまよっていました ^^'

編集ビューのダブルRenderPartialに関しては、 CategoryDe ​​scription に既にデータ行があるかどうかに関係なく、新しいデータ入力用の新しいフィールドが必要なため、これが必要です。

マスター/詳細フォームをどのように作成したか疑問に思っている人のために、最終的なフィールドセットを次に示します。

        <fieldset>
        <legend>CategoryDescription</legend>
        <% foreach (var catdes in Model.CategoryDescriptions) { %>
            <% Html.RenderPartial("CategoryDescription", catdes); %>
        <% } %>
        <% 
            CategoryDescription emptyCatDes = new CategoryDescription();
            Html.RenderPartial("CategoryDescription", emptyCatDes, new ViewDataDictionary()); %>
    </fieldset>

100% 効果があるかどうかはまだわかりませんが、現在、すべての情報がViewに正しく表示されています。

みなさん、頑張ってください。NickLarsenの助けに感謝します。

于 2010-10-04T13:50:17.167 に答える