問題の概要:
@Html.Action(...) を使用して呼び出されるアクションを持つ Surface コントローラーを作成しました。
@Html.Action 呼び出しはマクロ部分ビュー内で行われ、マクロはリッチ テキスト エディターを使用してページのコンテンツ内に含まれます。
(私はこれに慣れていないので、間違った方法で物事を進めている場合はお知らせください。)
Surface コントローラーには GET アクションと POST アクションがありますが、マクロ パーシャル内で呼び出されるのは get アクションです。
Get アクションは正常にレンダリングされます。フォームにデータを入力しないと、モデルの状態が無効になります (これは私が現在テストしているものです)。
(データを入力せずに) フォームを送信すると、POST アクションに入ることができ、ModelState.IsValid が false に設定され、CurrentUmbracoPage() が返されます。
すべて問題ありません...デバッグ時に例外は発生しません...
この時点で、「部分ビュー スクリプトの読み込み中にエラーが発生しました」というエラー テキストがページに表示されます。
私がやろうとしているのは、検証メッセージが表示された同じページを返すことだけです。
詳細:
アンブラコ v6.0.5
現在取り組んでいるコントローラーは、ユーザーのパスワードをリセットするために使用されます。RedirectToCurrentUmbracoPage() を使用してこの問題を回避するログイン コントローラーもあります。
マクロを含むページにアクセスするには、アドレス http://{testhost}/Reset-Password を使用します返されたエラー テキストは次のとおりです: 部分ビュー スクリプトの読み込み中にエラーが発生しました (ファイル: ~/Views/MacroPartials/ResetPassword.cshtml)
コードは別のソリューション内にあり、ビューと bin ディレクトリは全体にコピーされます。nuget パッケージ UmbracoCMS.Scaffolding を使用しています。
コントローラーコード:
public class ResetPasswordSurfaceController : SurfaceController {
[ChildActionOnly]
[HttpGet]
public ActionResult Reset(string token, string email) {
// Validation Code Omited
var user = Membership.GetUser(username);
return PartialView("Reset", new ResetPasswordSurfaceModel { UserID = user.ProviderUserKey.AsInt() });
}
[HttpPost]
public ActionResult PostReset(ResetPasswordSurfaceModel model) {
if (ModelState.IsValid) {
//Password reset code omited
return RedirectToCurrentUmbracoPage();
}
//works but only partial view content is rendered
// return PartialView("Reset",model);
return CurrentUmbracoPage();
}
}
ビュー - ~\Views\ResetPasswordSurface\Reset.cshtml:
@model UmbracoExt.Models.ResetPasswordSurfaceModel
@using (Html.BeginUmbracoForm("PostReset", "ResetPasswordSurface")) {
@Html.EditorForModel()
<input type="submit" value="Submit" />
}
マクロ部分ビュー - ~\Views\MacroPartials\ResetPassword.cshtml:
@inherits Umbraco.Web.Macros.PartialViewMacroPage
@Html.Action("Reset", "ResetPasswordSurface")
どんな助けでも大歓迎です。
編集:
Reset アクションから [HttpGet] 属性を削除すると、PostReset アクションが呼び出された後に Reset アクションも呼び出されることが明らかになりました。
PostReset の名前を Reset に変更し、httpget 属性を元の Reset アクションに再度追加すると、post アクションが 2 回呼び出されます。2 回目に呼び出されると、例外が発生します。SurfaceController フォームを使用する場合、UmbracoPageResult は Http POST のコンテキストでのみ使用できます。
変更を元に戻したので、PostReset アクションの後に Reset ([HttpGet]) が呼び出されています。
したがって、問題はまだ残っています。この問題を回避するにはどうすればよいですか? PostReset アクションから結果を返す必要があります。