2017-01-26 9 views
0

@Html.EditorForの中からコントローラアクションにポストされたプロパティ名を変更することはできますか?ASP.NET MVC5コントローラのアクションメソッドパラメータnull

私は、オブジェクトのリストとユーザーがフォームを作成できるようにするフォームの両方を表示するビューを持っています。可能であれば、ビューモデル全体ではなく、作成時に新しいオブジェクト値をポストバックしたいだけです。私はすべての既存のオブジェクトを表示するためにExistingObjectsをループ、と私は@Html.BeginForm("Index", "GenericController", FormMethod.Post)でフォームを作成し、私が持っている内部てるの下にいビューで

public class GenericIndexViewModel 
{ 
    public IEnumerable<GenericListViewModel> ExistingObjects { get; set; } 
    public GenericCreateViewModel NewObject { get; set; 
} 

public class GenericCreateViewModel 
{ 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
} 

:ビューのための

私のViewModel構造は次のようになります適切な@Html.EditorFor(m => m.NewObject.PropertyA)。以下のビュースニペット:次のように

@model Namespace.Models.Generic.GenericIndexViewModel 
... 
@if (Model.ExistingObjects.Any()) 
{ 
    // Display list of objects 
} 
... 
@using (Html.BeginForm("Index", "GenericController", FormMethod.Post)) 
{ 
    @Html.ValidationSummary(true) 

    <div class="field-holder"> 
     @Html.LabelFor(m => m.NewObject.PropertyA) 
     @Html.EditorFor(m => m.NewObject.PropertyA) 
    </div> 

    <div class="field-holder"> 
     @Html.LabelFor(m => m.NewObject.PropertyA) 
     @Html.EditorFor(m => m.NewObject.PropertyA) 
    </div> 

    <div> 
     <input type="submit" value="Save" name="command" /> 
    </div> 
} 

アクションメソッドのシグネチャは次のとおりです。

[HttpPost] 
public ActionResult Index(GenericCreateViewModel model) { ... } 

私はmodelパラメータがnullですが、それは成功したアクションメソッドを打つフォームを送信します。

私は性質がNewObjectが付いされていることがわかりますポストデータ検査:

NewObject.PropertyA=test1&NewObject.PropertyB=test2 

どのように接頭辞を防ぐ、あるいは引数として接頭辞の特性を認識するためのアクションメソッドを取得しないのいずれかを?

+0

ビュー内の@modelは何ですか? –

+0

必要な関連コードを表示してください –

+0

リクエストされたビュースニペットが追加されました。 –

答えて

2

@Html.EditorFor(m => m.NewObject.PropertyA) 

にあなたのエディタを変更してみてくださいそして

[HttpPost] 
public ActionResult Index(GenericIndexViewModel model) { ... } 

にあなたのポストのアクションを変更し、必要なGenericCreateViewModelを取得するためにmodel.NewObjectにアクセスします。

それとも、でそれを試すことができます。

<div class="field-holder"> 
    <label>PropertyA</label> 
    <input type="text" name="PropertyA" /> 
</div> 

<div class="field-holder"> 
    <label>PropertyB</label> 
    <input type="text" name="PropertyB" /> 
</div> 
<div> 
    <input type="submit" value="Save" name="command" /> 
</div> 

とあなたのPOSTメソッドでGenericCreateViewModelオブジェクトを受信し続けます。

[HttpPost] 
public ActionResult Index(GenericCreateViewModel model) { ... } 

これは、望ましい結果を達成する単なる1つの方法です。

+0

'ExistingObjects 'データを含む' GenericIndexViewModel'全体をポストバックしませんか? –

+0

テスト済みであり、そうでない場合、 'BeginForm'内のプロパティのみがポストされます。どうもありがとう! –

0

デフォルトのフォーム動作は完全なモデルをコントローラに戻すので、これを簡単に修正するには、ポストインデックス方法のパラメータをGenericIndexViewModelに変更します。

C#メソッドをそのまま使用したい場合は、データのフォーマット方法をオーバーライドして、onsubmitイベントで投稿リクエストを自分で作成する必要があります。

関連する問題