3

複雑なモデルの一部を変更するための単純なフォームがあります。もちろん、モデルを簡略化することもできますが、最終的にはモデル全体を扱うことになるため、複雑なケースを解決したいと考えています。

レンダリングされた入力に単純な ID と名前を付けたいのですが、モデル名が動かないようです。

@Html.EditorFor(model => model.CallInfo.Phone1,
   new { @id = "Phone1", @name = "Phone1"})

これを出力する必要があります

<input type="text" value="" name="Phone1" id="Phone1" class="text-box single-line">

代わりに、これを出力し、どこでも CallInfo を前に付けます。

<input type="text" value="" name="CallInfo.Phone1" id="CallInfo_Phone1" class="text-box single-line">

これを無効にできない場合、CallInfo.Phone1パラメーターをアクション メソッドのパラメーターに自動解析する方法はありますか? これは、C# では無効な構文であるためです。

public ActionResult UpdatePhoneNumber(Int32 profileId, String CallInfo.Phone1)

繰り返しますが、リクエストから手動で取得できることに気付きました。

HttpRequest.Current.Params["CallInfo.Phone1"]

しかし、ここでは C# MVC4 の規則がうまく連携して、これらの自動魔法のウィジェットの 1 つが正しいことを行うように思われます。

更新: Dmitri の回答に続いて、ビュー マークアップをそのままにして、name="CallInfo.Phone1"属性を生成し、アクション シグネチャを次のように変更しました。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdatePhoneNumber(Int32 profileId,
    [Bind(Prefix = "CallInfo")] string phone1)
{
    // Save it
}

デバッガーでphone1は null であり、データベースに保存されません。firebug からキャプチャされた投稿本文には、次のように書かれています。

Parameters          application/x-www-form-urlencoded
CallInfo.Phone1     8121234567

pまた、Phone1パラメーター名で大文字を使用しようとしましたが、効果がありませんでした。

4

2 に答える 2

1

これを無効にできない場合、CallInfo.Phone1 パラメータを取得してアクション メソッドのパラメータに自動解析する方法はありますか? これは、C# では無効な構文であるためです。

確かに、[Bind]属性を使用して:

public ActionResult UpdatePhoneNumber(
    int profileId, 
    [Bind(Prefix = "CallInfo")] string phone1
)
{
    ...
}

ビューモデルを定義することにより、さらに良い:

public class MyViewModel
{
    public int ProfileId { get; set; }
    public CallInfoViewModel CallInfo { get; set; }
}

public class CallInfoViewModel
{
    public string Phone1 { get; set; }
}

次に、コントローラー アクションにこのビュー モデルを引数として使用させます。

public ActionResult UpdatePhoneNumber(MyViewModel model)
{
    ...
}
于 2013-01-24T07:38:43.037 に答える
0

私の理解が正しければ、Action メソッドの引数として CallInfo.Phone1 と Phone1 が必要です。その場合、モデルは CallInfo モデルと Phone1 (文字列?) パラメータのコンテナである必要があります。

class bigModel
{
   CallInfoType CallInfo { get;set;}
   string Phone1 { get;set;}

}

ビューに同じモデルを渡す

@model Project.Models.bigModel

アクションメソッドの署名で使用します

    public ActionResult Edit(bigModel);
于 2013-01-24T07:39:23.703 に答える