ASP.NET MVC 3のデフォルトの強い型の編集ページは、通常、エンティティのすべてのフィールドを公開します。これは多くの場合実行可能ですが、一部のフィールドはセキュリティリスクです。たとえば、簡略化された雑誌の購読エンティティは次のようになります。
public void Subscription() {
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
public DateTime SubscribedThru { get; set; }
}
たとえば、ユーザーが自分のアドレスを変更できるように編集ページを提供する場合SubscribedThru
、知識が豊富で悪意のあるユーザーが日付を偽造することで10年間の無料サブスクリプションを提供できるため、フィールドを含めることはセキュリティ上のリスクになります@Html.HiddenFor(model => model.SubscribedThru)
。したがって、(かみそりを介して)編集ページのhtmlにそのフィールドを含めることはありません。
答えは、SubscribedThru
次のようなものを使用して、コントローラーのEditメソッドでのバインドの試行を防ぐことかもしれないと思いました。
[HttpPost]
public ActionResult Edit([Bind(Exclude="SubscribedThru")] Subscription subscription) {
if (ModelState.IsValid) {
db.Entry(subscription).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
}
return View(subscription);
}
行に到達すると、SubscribedThruの日付が(正しく?)存在しないと思われるSaveChanges();
エラーがスローThe conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
され、空の値はSQLServerで処理できる値よりも小さくなります。私が驚いたのは、Bindingが除外されているときに、そのフィールドを更新しようとしていることです。
これまでのところ、私の最善の解決策は、SubscribedThruの日付を省略したカスタムViewModelを作成することであるようですが、フィールドの重複、検証などが多いようです。SubscribedThru
可能であれば、1つのフィールドをユーザーによる編集から保護したいと思います。
UpdateModel
と方法を完全に理解しているとは言えず、TryUpdateModel
それが進むべき方向なのだろうか?私はそれらで遊んだのですが、EFは、オブジェクトが重複している(同じキー)と困惑しているというエラーをスローします。
public ActionResult Edit(int id)
また、サブスクリプションデータがコントローラーの初期ロードから最終[HttpPost]
public ActionResult Edit(Subscription subscription)...
メソッドまで保持されるのか、それとも行がdb.Entry(subscription).State = EntityState.Modified;
すべてのデータを設定しようとするのかがわかりません(「 editd-so-EF-should-save-this ")。
私は長年の.NET開発者であり、最初のASP.NET MVCプロジェクトに飛び込んだばかりなので、おそらく痛々しいほど明白なことを見落としています。助けてくれてありがとう!