9

問題の概要:

@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 アクションから結果を返す必要があります。

4

3 に答える 3

11

これが私がこの問題を解決した方法です:

  1. モデルの拡張メソッドを作成しました:

    public static class ExtensionMethods
    {
       public static void MapModel<T>(this WebViewPage<T> page) where T : class
       {
          var models = page.ViewContext.TempData.Where(item => item.Value is T);
    
          if (models.Any())
          {
             page.ViewData.Model = (T)models.First().Value;
             page.ViewContext.TempData.Remove(models.First().Key);
          }
       }
    }
    
  2. コントローラーコード:

    [HttpPost]
    public ActionResult Index(MyModel model)
    {
        TempData.Add("MyModel", model);
        return RedirectToCurrentUmbracoPage();
    } 
    
  3. 部分ビュー コード:

     @using UmbracoTest.Extension
     @using UmbracoTest.Models
     @model MyModel
     @{
         this.MapModel<MyModel>();
      } 
    
     @using (Html.BeginUmbracoForm("Index", "Home", FormMethod.Post))
     { 
          <div>
            @Html.TextBox("Text", Model.Text )
          </div>
    
         <input type="submit" name="submit" value="Submit" />
     }
    
于 2013-07-07T06:39:31.443 に答える
3

答えはここで私に与えられました

すべてのクレジットはシャノン・デミニクに行きます

投稿アクションは、応答に対して何も返しません (そのビットは私にとって初めてでした)。リセット アクションが 2 回目に実行されたときの投稿後、モデル状態が維持されるため、新しくインスタンス化されたモデルを渡すことにより、このモデルは POST アクションで処理されたモデルのモデル状態を継承します (PostReset)。

リセット アクションが 2 回目に呼び出されたとき、検証ロジックは、部分ビューを返すポイントに到達しないことを意味していました。

私は一時的に検証ロジックをバイパスし、モデルの検証メッセージが表示されたことを確認しました。

于 2013-05-31T04:28:31.183 に答える