2

さて、この問題は私には信じられないほど奇妙に思えます。新しい記事の編集と作成の両方に使用されるビューがあります。既存の記事の編集は完全に機能しますが、新しい記事を作成すると null 参照の例外が発生します (「オブジェクト参照がオブジェクトのインスタンスに設定されていません」)。

これが私のコードです:

//Return Edit/New partial view. New if Id < 0 (will be -1)
public ActionResult Edit(int Id)
{
    Models.Article a;
    if (Id > 0)
    {
        Models.Entities db = new Models.Entities();
        a = db.Article.FirstOrDefault(dba => dba.Id == Id);
    }
    else
    {
        a = new Models.Article();
        a.Id = -1;
        a.DateProperty = DateTime.Now;    //Repeat for each date property
        a.Property = "";    //Repeat for every string property
    }
    return PartialView("~/Views/Article/Edit.cshtml", a);
}

次に、以下を含むビューを返します (同じ行に沿ってさらに多くの要素を含みます)。

<label for="txtTitle">Title</label>
<input type="text" id="txtTitle" data-originalvalue="@Model.Title" value="@Model.Title" />
<span class="actionButton actionUndo revert" title="Undo Changes">Revert</span>

<label for="txtPublishDate">Publish Date</label>
<input type="text" id="txtPublishDate" class="datePicker" data-originalvalue="@Model.PublishDate.ToShortDateString()" value="@Model.PublishDate.ToShortDateString()" />
<span class="actionButton actionUndo revert" title="Undo Changes">Revert</span>

何らかの理由で、これが呼び出されるたびArticle/Edit?Id=-1にページが読み込まれ、前述のエラーが発生します。強調表示されているコードは、data-originalvalue属性 (カスタム HTML5 データ フィールド) にあります。

これらのカスタム データ フィールドを削除すると、同じエラーが発生しますが、[No relevant source lines].

なぜこれが起こるのか、私は非常に混乱しています。

モデル自体は ADO.Net を使用してデータベースから生成され、プロジェクトは MVC 4 と .Net 4.5 を使用します。

4

1 に答える 1

0

私は答えを持っていると思います。これは、ADO.Net と MVC がこの特定の方法で一緒にプレイしたくないという問題かもしれないと思います (ただし、誰かがより良い解決策を持っている場合は、ここに投稿してください。答えとして受け入れます)。

次の回避策を実装できました。

というコンテナー クラスとArticleContainer、Article とほぼ同じ というクラスを作成しましたBlankArticle。これには、Article オブジェクトがデータベースに持つすべてのプロパティがあります (これは、ADO.Net でオブジェクトに割り当てられたプロパティとは異なることに注意してください。これについては、ページの少し下で説明します)。

Article containerは次のとおりです。

public class ArticleContainer
{
    public ArticleContainer()
    {
        //
    }

    public Article ExistingArticle { get; set; }
    public BlankArticle NewArticle { get; set; }
}

次に、BlankArticleオブジェクト (基本的に と同じプロパティを持つArticle) を作成し、ArticleContainer新しいオブジェクト (例: Id < 0) の場合はそれをオブジェクトに配置し、Article既にデータベースにある場合はオブジェクト (ADO.Net によって生成された型) を配置します。

次に、ビューは各フィールドの変数を作成し、 null のExistingArticle場合から変数を割り当てますNewArticle。その逆も同様です。

私がこれを行う必要があった理由は、(JSON として ADO.Net オブジェクトを返そうとしたことがある人なら誰でも知っているように) 他のオブジェクトと関係を持つ ADO.Net オブジェクトには、元のオブジェクトの PART として含まれているオブジェクトがあるからです。

例: AnArticleは a と多対 1 の関係を持つ場合があります。これは、テーブル内に特定の記事を指すフィールドがある可能性がViewあることを意味します。ADO.Net モデルでは、そのオブジェクトはプロパティとしてオブジェクトを持ち、オブジェクトはプロパティ (明らかにビューのリストを含む) を持ちます。ViewArticleIDViewArticleArticleList<View>

データベース内の他のオブジェクトを参照するオブジェクトは、実際にデータベース内にない限り MVC ビューに渡すことができないようです (新しいオブジェクトが実際にはデータベース内の他のオブジェクトを参照していなくても、潜在的に参照しています)。上記の修正は私がエレガントと呼ぶものではありませんが、簡単で効果的です。

于 2013-05-30T00:55:28.873 に答える