5

次のアクションメソッドがあります。

public ActionResult ProfileSettings()
        {
            Context con = new Context();
            ProfileSettingsViewModel model = new ProfileSettingsViewModel();
            model.Cities = con.Cities.ToList();
            model.Countries = con.Countries.ToList();
            model.UserProfile = con.Users.Find(Membership.GetUser().ProviderUserKey);
            return View(model); // Here model is full with all needed data
        }

        [HttpPost]
        public ActionResult ProfileSettings(ProfileSettingsViewModel model)
        {
            // Passed model is not good
            Context con = new Context();

            con.Entry(model.UserProfile).State = EntityState.Modified;
            con.SaveChanges();

            return RedirectToAction("Index", "Home");
        }

@using (Html.BeginForm("ProfileSettings", "User", FormMethod.Post, new { id = "submitProfile" }))
        {
            <li>
                <label>
                    First Name</label>
                @Html.TextBoxFor(a => a.UserProfile.FirstName)
            </li>
            <li>
                <label>
                    Last Name</label>
                @Html.TextBoxFor(a => a.UserProfile.LastName)
            </li>
...
<input type="submit" value="Save" />
...

POSTメソッドで受信したモデルを送信すると、不完全です。FirstName、LastName などが含まれますが、UserID は null です。したがって、オブジェクトを更新できません。ここで何が間違っていますか?

4

3 に答える 3

2

MVC は、リクエストに含まれるものにのみ基づいてモデルを再構築します。あなたの特定のケースでは@Html.TextBoxFor()、ビューに含まれる唯一の呼び出しであるため、FirstName と LastName のみを送信しています。MVC モデルは のようViewStateに動作せず、どこにも保存されません。

また、エンティティ全体をビューモデルに含めたくありません。必要なのは ID だけである場合は、それだけで十分です。次に、エンティティを DAL から再度読み込み、変更が必要なプロパティを更新して、変更を保存します。

于 2012-06-18T21:53:40.390 に答える
1

ビューに HTML タグ HiddenFor を追加し、Get アクションで UserId を設定していることを確認します。

@using (Html.BeginForm("ProfileSettings", "User", FormMethod.Post, new { id = "submitProfile" }))
        {

@Html.HiddenFor(a => a.UserProfile.UserId)
// your code here..

}
于 2012-06-18T22:23:35.253 に答える