複数のページで再利用できるようにしたい機能(一部の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に送信するように指示しているためです!)。