0

私はMVC 3スタイルのコーディング全体に不慣れです。問題が発生していますが、まず、Web サイトをどのようにレイアウトしたかを示します。

_Layout.cshtml が含まれています

        @if (Request.IsAuthenticated)
        {
            <div class="span2">
                @Html.Partial("_NavigationPartial")
            </div>
            <div class="span10">
                @RenderBody()
            </div>
        }
        else
        { 
            @RenderBody()
        }

@RenderBody以下を含む Profile.cshtml ファイルが表示されます。

@{
    ViewBag.Title = "My Profile";
}
<div class="row-fluid well">
    <div class="page-header">
        <h1>
            Profile</h1>
    </div>
    @{ 
        Html.RenderPartial("ChangePersonalInformationPartial");
        Html.RenderPartial("ChangePasswordPartial");
        }
</div>

ご覧のとおり、2 つのパーシャルがあります (1 つは個人情報を変更するためのもので、もう 1 つはパスワードを変更するためのものです)。

これらの各パーシャルは、独自のモデル (ChangePersonalInformationModelおよびChangePasswordModel) を使用します。

で送信をクリックすると問題が発生しChangePasswordPartial、_Layout.cshtmlページがリロードされますが、今回はロードされるだけChangePasswordPartial.cshtmlです。Profile.cshtml を読み込むために必要です。しかし、先に進んでに変更するAccountController.csreturn View();return View("Profile");次のエラーが表示されます。

ディクショナリに渡されたモデル アイテムのタイプは「PROJECT.Models.ChangePasswordModel」ですが、このディクショナリにはタイプ「PROJECT.Models.ChangePersonalInformationModel」のモデル アイテムが必要です。

この問題を解決するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

2

ChangePassword基本的に、パスワード情報を保存したら、アクション内のプロファイル アクションにリダイレクトする必要があります。

アップデート:

最初に、 と をまとめた共通のモデル sayProfileModelを用意する必要がChangePasswordModelありChangePersonalInformationModelます。

ここでは、表示および編集用のプロファイル情報を表示するアクションを示します。

// this action will returns a views that displays profile info
public ViewResult Profile(string username)
{
  ProfileModel model = .. get the profile from database based on username

  return View(model);
}

// this action will returns the profile info for editing or adding a new profile
public ViewResult EditProfile(string username)
{
   .. if the profile already exists get from database
   ProfileModel model = 

   .. if this is a new profile create an empty model
   ProfileModel model = new ProfileModel();
   model.ChangePasswordModel = new ChangePasswordModel();
   model.ChangePersonalInformationModel = new ChangePersonalInformationModel();

   return View(model);
}

あなたEditProfile.cshtmlはこうなる

@model Models.ProfileModel

...
@{ 
   Html.RenderPartial("ChangePersonalInformationPartial", 
                                  Model.ChangePersonalInformationModel);
   Html.RenderPartial("ChangePasswordPartial", Model.ChangePasswordModel);
}
...

これがあなたのChangePassword行動になります

[HttpPost]
public ActionResult ChangePassword(ChangePasswordModel model)
{
  if(ModelState.IsValid)
  {
     // save the ChangePasswordModel to database and display the profile info
     // or even you can redirect to EditProfile for more editing
     return RedirectToAction("Profile"); 
  }      

   .. there are validation errors so get the complete profile model from database
   .. the ChangePasswordModel form will be filled by the details entered in the form
   .. and not from the db details this will be taken care by the framework itself.
   ProfileModel model = 
   return View("EditProfile", model);     
}
于 2012-06-21T17:42:31.487 に答える