0

通常、フォームをデザインするとき、期待するデータはページのビューモデルの一部であり、クラスをコントローラーメソッドに配置すると、バインディングが機能します。

ただし、マスターページの部分ビューにフォームを追加しているため、特定のビューモデルに固有のものではありません。フォームフィールドのIDが、通常は自動的に生成されるIDと一致することを確認しようとしましたが、コントローラーメソッドではオブジェクト値が常にnullになっています。

これが私のマスターページの部分的なビューからのスニペットです:

            <tr>
                <td >Current password:</td>
                <td><%= Html.Password("PasswordChange.OriginalPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td>
            </tr>            
            <tr>
                <td >New password:</td>
                <td><%= Html.Password("PasswordChange.NewPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td>
            </tr>

ご覧のとおり、PasswordChangeはすべてのビューモデルの一部ではありません(このフォームを使用するために、すべてのビューモデルを共通ベースから継承する必要はありませんか?)。

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

[HttpPost]
        public ActionResult ChangePassword(PasswordChange PasswordChange)
        {

メソッドをヒットしましたが、PasswordChange.OriginalPasswordとPasswordChange.NewPasswordは常にnullです。

これを行う簡単な方法があると思いますが、理解できません。

4

2 に答える 2

2

プレフィックスを削除します。

<tr>
    <td>Current password:</td>
    <td><%= Html.Password("OriginalPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td>
</tr>            
<tr>
    <td >New password:</td>
    <td><%= Html.Password("NewPassword", "", new RouteValueDictionary { { "class", "required remote" } })%></td>
</tr>

または、プレフィックスを保持する場合は、必ず次のプレフィックスを定義してください。

[HttpPost]
public ActionResult ChangePassword(
    [Bind(Prefix = "PasswordChange")] PasswordChange model
)
{
    ...
}

ちなみに、代わりに子アクションの使用を検討することもできます。

public class PasswordChangeController: Controller
{
    [ChildActionOnly]
    public ActionResult Index()
    {
        var model = new PasswordChange();
        return PartialView(model);
    }
}

次に、部分をレンダリングする代わりにマスターページ内で、子アクションをレンダリングします。

<% Html.RenderAction("Index", "PasswordChange"); %>

そしてもちろん~/Views/PasswordChange/Index.ascx、フォームを生成してヘルパーの強く型付けされたバージョンを使用できる、強く型付けされた部分ができます。

blog post子の行動の詳細については、このトピックに関するPhilHaackの記事を参照してください。

于 2013-02-18T17:02:59.883 に答える
0

PasswordChangeクラスのメンバーがパブリックに設定されていませんでした。

@%$#$ ^#%&%

から

public class PasswordChange
    {
        public OriginalPassword { get; set; }
        public NewPassword { get; set; }
    }

public class PasswordChange
    {
        public string OriginalPassword { get; set; }
        public string NewPassword { get; set; }
    }
于 2013-02-18T17:04:41.777 に答える