2

モデルバインディングで一日中試した後、結果が得られなかったので、ここで質問することにしました。

ユーザー (別名販売者) がユーザーの詳細を編集できる asp.net かみそりのビューがあります。さらに、ユーザーは自分のパスワードを変更できる必要があります。

ViewModel を作成しました。

public class EditSellerViewModel
{
    public Seller Seller { get; set; }
    public ChangePasswordModel ChangePasswordModel { get; set; }
}

私のビューには、2 つの「送信」ボタンが表示される 2 つのフォームがあります。私のアクションでは、どのボタンがクリックされたかを確認します。「パスワード」フォームが送信された場合、販売者エンティティに新しいパスワードを設定し (実際には機能します)、データベース内の何も変更しない (そして例外をスローしない) SaveChanges() を設定します。それは単に何もしません。

さらに、「Seller Detail」フォームが送信された場合、Sellers データを保存したい。ただし、ViewModel のプレフィックスを有効にする 2 番目のパラメーターを使用しても、TryUpdateModel は常に false です。

    [HttpPost]
    public ActionResult EditUser(string btnSubmit, FormCollection formValues, EditSellerViewModel editSellerViewModel)
    {
        int uid = baseFunc.GetIdForUsername(User.Identity.Name);
        var seller = bmDBCont.SellerSet.Single(s => s.Id == uid);

        if (btnSubmit == "saveSellerPassword")
        {
            seller.Password = editSellerViewModel.ChangePasswordModel.NewPassword;
            bmDBCont.ObjectStateManager.ChangeObjectState(seller, System.Data.EntityState.Modified);
            bmDBCont.SaveChanges(); //<-- does nothing
        }

        if (TryUpdateModel(seller, "Seller")) //<-- never true
        {
            bmDBCont.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.Titles = CommonListsProvider.GetTitles();
        ViewBag.Countries = CommonListsProvider.GetCountries();

        return View(editSellerViewModel);
    }

ここにいくつかのデバッグ情報のスクリーンショットがあります:

誰でも私を助けることができますか?

4

1 に答える 1

0

TryUpdateModel に関するドキュメントを参照してください。「コントローラーの現在の値プロバイダーの値とプレフィックスを使用して、指定されたモデル インスタンスを更新します。」

値プロバイダーで値を検索するときに使用するプレフィックス。

「prefix」パラメーターを使用せずに、TryUpdateModel(seller) の単純なメソッドを使用してみてください。

if(TryUpdateModel(seller))

http://msdn.microsoft.com/en-us/library/dd493137(v=vs.108).aspx

于 2013-01-23T22:35:45.253 に答える