0

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番目のコントローラーアクションに送信すると、更新された値で編集フォームに送信されたプロットではなく、基本的に新しい値を含む新しいプロットが返されます.

おそらく単純なものが欠けているだけだと思いますが、それが何であるかを理解できないようです。フォームのすべてのフィールドには、「プロット」という接頭辞が付いた ID があります。

私が間違っていることを知っている/見ている人はいますか?ありがとう。

4

2 に答える 2

1

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 Dictionary を取得しています。したがって、バインディングは発生しません。

次のポッドキャストを確認してください。

Spark で ViewData (強い型付けと弱い型付け) を使用する方法を調べる http://www.dimecasts.net/Casts/CastDetails/117

于 2009-09-17T02:10:56.457 に答える
1

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 で行う必要がある方法です...

于 2009-09-17T03:43:42.360 に答える