我的网站上有一些我希望能够在多个页面上重复使用的功能(一些 UI 和相关功能)。就这个问题而言,假设它是一个“评论”功能。
在我的组件应用程序中有一个区域,该区域中有一个控制器:/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>
Index 部分视图包含在带有 的视图中RenderAction
,如下所示:
<% Html.RenderAction("Index", "Comment", new { area = "Components" }); %>
此代码不起作用,因为部分视图中的表单提交给 CommentsController 上标记的操作[ChildActionOnly]
(这是设计使然,我不希望独立于托管页面请求“组件”)。
我怎样才能使这种“组件”方法起作用,即有一个提交表单以更改页面内组件状态而不丢失托管页面本身的部分视图?
编辑:
澄清一下,[ChildActionOnly]
这里的使用不是我的问题。如果我从我的操作方法中删除该属性,我的代码只会“起作用”,因为它不会引发异常。提交表单时,我的“组件”仍然会跳出其托管页面(因为我告诉表单提交到部分视图的 URL!)。