1

私のアプリで奇妙なことが起こっています。破損することはありませんが、奇妙な動作です。何が起こっているのかを理解するために連絡を取りました。

モデルに基づいた部分的なビューに取り組んでいましたが、うまくいきました。多くのものを正しい入力に置き換える必要があることがわかりました。

だからここに私の古いモデルのスニペットがあります:

public class SearchObjInfo
{
    public string m_ObjName { get; set; }
    public string m_ObjType { get; set; }
    public decimal? m_ObjNumber { get; set; }
    public string m_ObjSymbol { get; set; }
    public string m_ObjPower { get; set; }
}

そして、この部分ビューを構築するために作成した新しいクラスを含む同じスニペットを次に示します。

public class SearchObjInfoPartial
{
    public string m_ObjName { get; set; }
    public IEnumerable<SelectListItem> m_ObjType { get; set; }

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:0}")]
    public int m_ObjNumber { get; set; }
    public IEnumerable<SelectListItem> m_ObjPower { get; set; }
    public IEnumerable<SelectListItem> m_ObjSymbol { get; set; }
}

現在、レンダリングが行われる方法は、実際にはまったく同じであり、そうではありません。以前は次のようなものをたくさん使用していました。

<label>
    Text: Write a name, part of a name, or a word.
</label>
Object Name: @Html.TextBox("_objectName") <br/>
Object Number: <input type="number" min="0" max="9999" name="_objNumber" value="decimal" style="width: 70px"/><br/>
Type: @Html.DropDownList("_objType", "All") <br/>
Power: @Html.DropDownList("_objSymbol", "=") @Html.DropDownList("_objValue", String.Empty)<br/>

しかし今、私はこのように私の部分的なビューをレンダリングします:

@model MyApp.Utilities.SearchObjInfoPartial

Object Name: @Html.TextBoxFor(item => item.m_ObjName, Model.m_ObjName, String.Empty) <br/>
Object Number: @Html.EditorFor(item => item.m_ObjNumber)<br />
Power: @Html.DropDownListFor(item => item.m_ObjPower, Model.m_ObjPower, String.Empty)      @Html.DropDownListFor(item => item.m_ObjSymbol, Model.m_ObjSymbol, String.Empty)
Type: @Html.DropDownListFor(item => item.m_ObjType, Model.m_ObjType, String.Empty) <br/>

レンダリングする前に、SelectLists を処理しますが、ここでは問題ありません。

ここからが興味深いところです。

私のコントローラーには、大量のデータを受け取るメソッドがありました (こちらを参照してください: How to deal with many possible values to make a query? )

でも今は別のものを作りました。考えずに、次のように古い検索モデルをコントローラー メソッドに追加しようとしました。

public ActionResult BrowseObjectList(SearchObjInfo searchObj, string _objName, (...))

そして、受信オブジェクトが部分ビュー モデルで使用されているものと同じでなくても機能することがわかりました。それはどのように可能ですか?つまり、適切なフィールドがいっぱいになり、searchObj アイテムを「安全に」処理できますが、結局のところこれは安全ではありません...

4

1 に答える 1

2

それが、MVC フレームワークがあなたのために行うことです。

ブラウザは、フォーム コレクションを Name Value Collection としてサーバーに送信するだけです。リクエストがサーバーに到達すると、MVC フレームワークは値を Action メソッドのパラメーターと照合します。

  • フォーム コレクションの値は、モデル オブジェクトのプロパティにマップされます。これは、プロパティ名とフォーム コレクションの値の名前との一致を行うことによって行われます。ソースを表示してクライアント側のコードを確認するだけで、入力タグにモデルのプロパティ名と一致する属性「名前」があることがわかります。
  • QueryString 値は、名前に基づいて Action メソッドのパラメーターにもマップされます。
  • 隠しフィールドを追加して、アクションメソッドで同じ名前のパラメーターを指定しても...多田ポストバック時にその変数の隠しフィールドの値を取得します

あなたの場合、モデルは異なりますが、そのプロパティ名は同じm_ObjName、m_ObjType、m_ObjNumber、m_ObjSymbol、m_ObjPowerです。したがって、MVC はあなたのためにマッチを行います。

別のプロパティ名で試して、結果を確認してください;-)

于 2013-05-07T20:04:22.213 に答える