【发布时间】:2011-05-07 16:05:14
【问题描述】:
我的网站上有一些我希望能够在多个页面上重复使用的功能(一些 UI 和相关功能)。就这个问题而言,假设它是一个“评论”功能。
在我的组件应用程序中有一个区域,该区域内有一个控制器:/Controllers/CommentController,以及两个部分视图:/Views/Comment/Index.ascx(用于列出 cmets)和 /Views/Comment/Create.ascx(用于创建 cmets)。
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!)。
【问题讨论】:
-
如果您不提供有效路由,则无法单独请求这些组件。执行 RenderAction 不需要有效的路由。
-
关于您的编辑:您只能将整个页面提交到 URL,而不仅仅是部分视图,除非您想对部分进行 ajaxy 处理。 Ajax 是这个网站发布 cmets 的方式。
标签: asp.net-mvc asp.net-mvc-2 partial-views renderaction