モデルオブジェクトの編集が期待どおりにビューにバインドされない
-
07-07-2019 - |
質問
ASP.NET MVC(1.0)、Spark View Engine(1.0)、SubSonic(3.0.0.3)を使用しています。
"編集"の取得に問題があります。正しく動作するように表示します。そのため、コントローラーには、フォームの編集ビューを表示する次のコントローラーアクションがあります。
[AcceptVerbs(HttpVerbs.Get)]
public virtual ActionResult Edit(string name)
{
var plot = Plot.SingleOrDefault(p => p.UserID == LoggedInUser.ID && p.UrlFriendlyName == name);
// ViewData["plot"] = plot;
return View(plot);
}
そのビューのフォームは、次のコントローラーアクションにポストバックします。
[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(Plot plot)
{
var validator = new PlotValidator();
try
{
var results = validator.Validate(plot);
if (!results.IsValid)
{
...
}
}
}
私が抱えている問題は、最初のコントローラーアクションが、送信されたPlotオブジェクトの値を実際にフォームに入力しないことです。フォームにデータを入力するための唯一の方法は、PlotをViewDataに追加することです:
ViewData["plot"] = plot;
それは編集フォームにデータを入力しますが、値を編集し、上記の2番目のコントローラーアクションに送信すると、基本的には、編集フォームに送信されたプロットではなく、新しい値を含む新しいプロットを送信します更新された値。
おそらく単純なものを見逃しているに違いありませんが、それが何であるかを理解することはできません。フォームのすべてのフィールドには、「plot」という接頭辞が付いたIDがあります。
誰が私が間違っているのか知っていますか?ありがとう。
解決
Sparkビューエンジンでどのように実行されるかわかりませんが、ASP.NET MVCに付属のすぐに使用できるビューエンジンでは、これは、プレーンバニラViewPageに付属する辞書を使用するのではなく、ページディレクティブを使用するページ。
したがって、ビューの最初のコード行の代わりに、次のようになります。
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage" %>
次のようになります。
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<HomePageViewModel>" %>
現在のコントローラーコードは厳密に型指定されたオブジェクトを想定していますが、代わりにViewDataディクショナリを取得しています。したがって、バインディングは発生していません。
次のポッドキャストを確認することを検討してください:
SparkでViewData(強く型付けされたものと弱い型付けされたもの)を使用する方法を調べる http://www.dimecasts.net/Casts/CastDetails/117
他のヒント
Hey Robert-Sparkがデータをどのように処理するかわかりませんが、2番目の部分は修正が非常に簡単です。
まず-MVCがDBに到達しないことを覚えておく必要があります。あなたの場合、レコードを引き出すための基準には2つの基準が関係しているようです。したがって、データが適切に設定されていることを確認したい場合は、もう一度それを引き出す必要があります。したがって、POSTで署名を次のように変更します。
[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(string id, FormCollection form)
{
//assuming you have some kind of PK
var plot = Plot.SingleOrDefault(p => p.ID == id);
UpdateModel(plot, form.ToValueProvider());
var validator = new PlotValidator();
try
{
var results = validator.Validate(plot);
if (!results.IsValid)
{
...
}
}
}
これはフリーハンドですが、とにかくL2Sでそれを行う方法です...