2

ASP.NET MVCについて何か誤解しているのか、ASP.NET MVC Beta 3で何らかのバグを見つけたのかを調べようとしています。HTMLヘルパーを使用しているときに、PartialViewが間違ったモデルを取得する問題が発生しています。拡張機能

私のコントローラーコードは次のようになります。

public ActionResult EditGeneral(MapGeneralViewModel vm)
{
    var query = MapGeneralViewModel.ToModel(vm, svcMaps);

    return PartialView("General", MapGeneralViewModel.FromModel(query));
}

これが挿入である場合、プロパティvm.Idは-1として開始され、MapGeneralViewModel.ToModelの呼び出し後、データベースに永続化され、query.Idに適切な値が設定されます。

MapSettingsViewModel.FromModelを呼び出すと、新しいビューモデルが返され、正しいIdプロパティに新しく作成されたid値が含まれていることを確認しました。

ビューの関連ビットは次のようになります。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AdminWebRole.Models.Map.MapGeneralViewModel>" %>
            <%: Model.Id %>
            <%= Html.Hidden("IdTest", Model.Id) %>
            <%= Html.HiddenFor(model => model.Id) %>

ビューにブレークポイントを設定すると、Model.Idが正しく設定されます。

コントローラの実際の出力(Model.Id == 70の場合)は次のようになります。

    70
    <input id="IdTest" name="IdTest" type="hidden" value="-1" />
    <input id="Id" name="Id" type="hidden" value="-1" />

したがって、HTMLヘルパーを使用せずに出力された値は正しいですが、ヘルパーによって出力された値は、コントローラーに渡されたビューモデルを何らかの形で取得しています。

私はこれがどのように起こっているのか分かりません。私はさまざまなことを試しました:

  • PartialView( )ではなくView()を使用する
  • MapGeneralViewModel.FromModel()の結果をvmに割り当ててから、 vmをビューに渡します
  • <%:および<%=を使用
  • vmをnullに設定します(古いビューモデルはどういうわけかまだ使用されています)
  • 着信IDの値を0に変更します(結果として、-1ではなく0がビューに出力されます)
  • 問題は「Id」と呼ばれるプロパティに固有のものではありません。同じ結果で他のフィールドもテストしました

これがどのように機能するのか混乱していますか、それともベータバグに遭遇しましたか?違いがある場合は、Win764ビットマシンのローカルAzureランタイム内で実行されています。

4

2 に答える 2

1

MVCが、ビューに明示的に渡されていない変数や、SessionまたはTempDataでぶらぶらしている変数を取得する方法はありません。

そのIdを-1に設定しているので、問題が発生した場合から始めます。

もう1つの可能性は、ModelStateのどこかで-1がぶら下がっている可能性です。HTMLヘルパーは、渡した値を使用することを決定する前に、まずModelStateを調べます。

于 2010-10-22T18:20:39.773 に答える
1

アイテムを注文で表示するために使用する部分ビューで、同様の問題が発生しました。

私は以下を使用して非表示の入力をレンダリングしていました。

@Html.Hidden("salesorderlineid", orderLine.SalesOrderLineID)

これは、間違った(削除された)アイテムのIDが使用されている場合に、アイテムを削除するまで正常に機能します。モデルを再確認しました。これは正しく、同じビューの他の使用法で正しくレンダリングされました。

非表示の入力を直接htmlとしてコーディングしましたが、正常に機能します-おそらくMVC3のバグのように見えますか?

<input type="hidden" name="salesorderlineid" value="@orderLine.SalesOrderLineID"/>

于 2013-04-12T09:24:13.393 に答える