1

編集画面に編集中の値が表示されるのに、保存しようとすると、HTTPPOST の編集に null オブジェクトがあるのはなぜですか?

追跡したエラーが発生しましたが、原因がわかりません。ドロップ リストに使用するクラスがあるため、AdvisoryTypeID と AdvisoryType しかありません。しかし今は、ユーザーがすべてをグリッド (インデックス) で表示し、新しいものを追加 (作成)、既存のものを変更 (編集) するための画面を作成しています。インデックス画面は問題なく DB から読み込みます。編集も同様です。作成する必要はありません。

ただし、編集と作成の両方で、HTTPPOST で同じエラーが発生します。エラーは、「'入力した値' が無効です」です。コードをデバッグすると、理由がわかりました: "advisoryTypes" 変数が null である理由がわかりません:

CONTROLLER (編集投稿用)

[Authorize]
[HttpPost]
public ActionResult Edit(AdvisoryTypes advisoryType)
{
    try
    {
       if (ModelState.IsValid)  //never get past this because it's null above
etc....
}

これを、編集と作成をうまく行う別の画面と比較したところ、同じです (たとえば、フィールド名を除く)。私は困惑しています。

モデル

public class AdvisoryTypes
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int AdvisoryTypeID { get; set; }

    [Display(Name = "Type")]
    [Required]
    public string AdvisoryType { get; set; }
}

CONTROLLER (Edit Get 用)

[Authorize]
    public ActionResult Edit(int id = 0)
    {
        AdvisoryTypes advisoryType = db.AdvisoryType.Find(id);
        if (advisoryType == null)
        {
            return HttpNotFound();
        }

        return View(advisoryType);
    }

見る

model TheNewSolution.Models.AdvisoryTypes

@{
 ViewBag.Title = "Edit Advisory Type";
}

<h2>Edit Advisory Type</h2>
@*<br />*@
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>Advisory</legend>
    <table>
        <tr>
            <td>
                @Html.HiddenFor(model => model.AdvisoryTypeID)
                <div class="editor-label">
                    @Html.LabelFor(model => model.AdvisoryType)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.AdvisoryType)
                    @Html.ValidationMessageFor(model => model.AdvisoryType)
                </div>
            </td>
        </tr>
    </table>

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

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

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

パート 2 いくつかの奇妙な背景: これは、EF を 5 から 6 alpha3 に更新してから作成した最初のモデル/コントローラー/ビューです (同じプロジェクトに POCO と edmx があり、これによりそのバグが解決されたため、作成する必要がありました)。モデルを手動で作成しました。ウィザードを使用してコントローラーを作成しようとすると、ウィザードで「ProjectName.Models.AdvisoryProviders のメタデータを取得できません」というエラーが表示されました。 'System.Data.Objects.ObjectContext'.".

その結果、別のコントローラーをコピー/貼り付けして変更を加え、同じ方法でビューを作成することにより、コントローラーを手動で作成する必要がありました。これはすべて関連していると思われますが、そうではないかもしれません。これが無関係であることが判明した場合は、これを削除して別の質問として投稿します。

4

2 に答える 2

0

なぜこれが解決したのかわかりませんが、これが私がしたことです。アプリ内の 3 つの異なるもの (タイプ、プロバイダー、カテゴリ) に対して、上記の画面 (グリッド付きインデックス、作成、編集) を作成する必要がありました。最初のタイプを実行した結果、上記の問題が発生しました。

「タイプ」画面からコントローラーとビューをコピーして貼り付け、必要に応じてモデルとフィールド名を変更し、画面に同じバグがあることを期待して、「プロバイダー」用に同じものを作成することにしました。しかし、画面はすべて機能しました。「カテゴリ」に対してもう一度やりましたが、これも機能しました。次に、失敗した「タイプ」の作成画面と編集画面を削除し、「プロバイダー」画面から再作成しました。そして彼らは働きました。

説明がありません。

于 2013-04-01T12:00:24.780 に答える
0

EF からの「以前に見た ProjectName.Models.AdvisoryProviders のメタデータを取得できませんでしたが、これは MySQL を使用していたことが原因でした。この種のエラーを回避し、すべてが機能していることを確認する唯一の方法は、http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19dを使用 してデータベースからモデルを作成し、次にhttp://blog.stevensanderson.com/2011/01/13/scaffold-を使用します。 your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/ を使用して、EF のビュー作成のバグのあるバージョンではなく、ビューを使用してコントローラーを作成します。

私はEF5でこれらの問題についてしばらく前に投稿しましたが、それは本当に苦痛でした.MVCScaffoldingは、MVC 4の組み込みのTTテンプレートよりもその苦痛をうまく処理しているようです.

お役に立てれば

于 2013-03-30T00:31:37.863 に答える