編集画面に編集中の値が表示されるのに、保存しようとすると、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'.".
その結果、別のコントローラーをコピー/貼り付けして変更を加え、同じ方法でビューを作成することにより、コントローラーを手動で作成する必要がありました。これはすべて関連していると思われますが、そうではないかもしれません。これが無関係であることが判明した場合は、これを削除して別の質問として投稿します。