1

複数のページで再利用できるようにしたい機能(一部のUIと関連機能)がWebサイトにあります。この質問の目的のために、それが「コメント」機能であるとしましょう。

私のアプリケーションにはコンポーネント用の領域があり、その領域内にはコントローラー:2/Controllers/CommentControllerつの部分ビュー:(/Views/Comment/Index.ascxコメントの一覧表示用)と/Views/Comment/Create.ascx(コメントの作成用)があります。

CommentControllerは次のようになります。

public class CommentController : Controller
{      
  [ChildActionOnly]
  public ActionResult Index()
  {
      return PartialView(GetComments());
  }

  [HttpGet]
  [ChildActionOnly]
  public ActionResult Create()
  {
      return PartialView(); //this is wrong.
  }

  [HttpPost]
  [ChildActionOnly]
  public ActionResult Create(FormCollection formValues)
  {
      SaveComment(formValues);

      return RedirectToAction("Index"); //this is wrong too.
  }
}

インデックス部分ビュー:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>

<div>
  <% foreach (var item in Model) { %>    
      <div>
          <%: item.Comment %>
      </div>
  <% } %>

  <%: Html.ActionLink("Add a Comment", "Create", "Comment", new { area = "Components" }, null) %>
</div>

部分ビューの作成:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<div>
    <% using (Html.BeginForm())
       {%>
        Enter your comment:
        <div>
            <input type="text" name="comment" />
        </div>
        <p>
            <input type="submit" value="Create" />
            <% //also render a cancel button and redirect to "Index" view  %>
        </p>
    <% } %>
</div>

インデックス部分ビューは、次のRenderActionようにビューに含まれます。

<% Html.RenderAction("Index", "Comment", new { area = "Components" }); %>

部分ビュー内のフォームは、マークされたCommentsControllerのアクションに送信されるため、このコードは機能しません[ChildActionOnly](これは仕様によるものであり、ホスティングページとは別に「コンポーネント」を要求したくない)。

この「コンポーネント」アプローチを機能させるにはどうすればよいですか。つまり、ホスティングページ自体を失うことなく、ページ内のコンポーネントの状態を変更するためのフォームを送信する部分ビューを作成できますか?

編集: 明確にするために、[ChildActionOnly]ここでの使用は私の問題ではありません。アクションメソッドから属性を削除すると、コードは例外をスローしないという点でのみ「機能」します。私の「コンポーネント」は、フォームが送信されたときにまだホスティングページから抜け出します(フォームに部分ビューのURLに送信するように指示しているためです!)。

4

2 に答える 2

3

ChildActionOnlyとしてマークされたアクションをターゲットにするようにフォームに要求することで、MVCを自分自身と戦わせています。

再利用性の高いウィザードフレームワークを設計していたときのこの問題の解決策は、アクションをChildActionOnlyとしてマークするのではなく、リクエストがajaxリクエストであるか単なるバニラリクエストであるかを検出することでした。

これらすべてのコードは、基本コントローラークラスにパッケージ化されています。派生コントローラーでは、次のようなことを行います。

[WizardStep(4, "Illness Details")]
public ActionResult IllnessDetails()
{            
    return Navigate();
}

ベースコントローラーのNavigate()メソッドが、ajaxリクエストであるかどうかに応じて、完全なビューを返すか、部分的なビューのみを返すかを決定した場合。そうすれば、部分的なビューを単独で返すことはできません。

それがAjaxリクエストであるかどうかを確認するために、Request.IsAjaxRequest()とTempDataの組み合わせを使用しました。ウィザードフレームワークはPRGパターンをすぐに実装するため、TempDataが必要です。したがって、元の投稿がajaxであったという事実を維持する必要があります。

これはたった1つの解決策であり、正しく行うには少し試行錯誤が必要だったと思います。でも今は、JKローリングのようにウィザードを開発した後も幸せに暮らしています...

于 2010-11-10T11:11:14.197 に答える
1

Ajaxを使用してパーシャルを投稿します。

于 2010-11-10T04:52:30.627 に答える