2

MVC4 プロジェクトでは、ViewModel を使用し、GET フォームを持つ部分ビューを使用しています。コントローラー アクションでは、ViewModel オブジェクトにデータが含まれていることを期待しています。このパーシャルを通常の (.cshtml) ビューに配置すると、コントローラー アクションで予期される ViewModel オブジェクトを介してデータを受け取ります。しかし、このパーシャルを別のパーシャル ビューに配置すると、何らかの理由でコントローラー アクションの ViewModel オブジェクトが空になります。HttpGet フォームの作成をステップ実行すると、渡されたモデルは空ではありませんが、GET コントローラー アクションが呼び出されると、モデルは空になります。

この理由を知っている人はいますか?これは私が知らないMVCの動作ですか?ありがとう!

パーシャル:

@model ViewModel
    @if (Model != null)
    {
        using (Html.BeginForm("DoSomething", "Home", FormMethod.Get))
        { 
            @Html.HiddenFor(m => m.Object)            
            <input id="btnSend" type="submit"> 
        }
    }

その他の部分:

@using OtherViewModel.ViewModel
@Html.Partial("The Partial", Model.ViewModel, ViewData)

景色:

@Html.Partial("_TheOtherPartial", Model.OtherViewModel, new ViewDataDictionary(ViewData) {
                TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "prefix" }
    })

コントローラー

[HttpGet]
[AllowAnonymous]
public ActionResult DoSomething(ViewModel data)
{
}
4

2 に答える 2

5

ここで考慮すべきことが 2 つ以上あります。1 つ目は、フォームを部分ビュー内に置かないようにすることです。これを行うと、有効な HTML ではないため、ブラウザでサポートされていないネストされたフォームになる可能性があります。

<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->

-(FORM)構造により、ネストされたフォームは許可されません。

2 つ目は、部分ビューではなく、エディター テンプレートを使用することをお勧めします。それらの使用方法については、こちらをご覧ください。次に、前に述べたように、フォームをエディター テンプレートの外に置くようにしてください。フォームをメイン ビューで使用し、エディター テンプレートでページの個別の部分をレンダリングできるようにします。混乱が少なくなり、コードがきれいになります。

あなたの特定の例では、次のようになります。

メイン ビュー:

@model MainModel
@using (Html.BeginForm("YourAction", "YourController"))
{ 
    @Html.EditorFor(m => m.OtherViewModel)
    <input id="btnSend" type="submit"> 
}

OtherViewModel.cshtmlエディタ テンプレート:

@model OtherViewModel
@Html.EditorFor(m => m.ViewModel)

ViewModel.cshtmlエディタ テンプレート:

@model ViewModel
@Html.EditorFor(m => m.Object)

メインコントローラー:

public ActionResult YourAction(MainModel data)
{
    ...

モデル:

public class MainModel
{
    public MainModel() { OtherViewModel = new OtherViewModel(); }
    public OtherViewModel OtherViewModel { get; set; }        
}

public class OtherViewModel
{
    public OtherViewModel() { ViewModel = new ViewModel(); }
    public ViewModel ViewModel { get; set; }
}

public class ViewModel
{
    public string Object { get; set; }
}

テンプレート名はモデル タイプ名を反映していることに注意してください。次に、テンプレートをこのディレクトリ~/Views/Shared/EditorTemplates/またはこの~/Views/YourController/EditorTemplates/ディレクトリの下に置きます。

于 2013-08-27T09:40:30.847 に答える
-1

または、「The View」で取得した元のモデルと同じモデルを「The Other Partial」に渡し、「The Partial」に再度渡し、必要な部分のみ対応するビューを使用することもできます。

于 2013-08-28T05:48:15.237 に答える