C# 跨不同控制器和视图重新使用局部视图(ascx)

C# 跨不同控制器和视图重新使用局部视图(ascx),c#,asp.net-mvc,viewmodel,C#,Asp.net Mvc,Viewmodel,假设我有两个控制器,TopicsController和PostsController 对于每个控制器,我有两个视图(索引和详细信息) 主题(索引)视图继承了System.Web.Mvc.ViewPage 主题(详细信息)视图继承了System.Web.Mvc.ViewPage 我使用的是TopicFormViewModel,因为我会随模型一起发送附加数据 Post(Details)视图只是继承了System.Web.Mvc.ViewPage 现在,我已经创建了一个局部视图(CreatePost.

假设我有两个控制器,TopicsController和PostsController

对于每个控制器,我有两个视图(索引和详细信息)

主题(索引)视图继承了
System.Web.Mvc.ViewPage

主题(详细信息)视图继承了
System.Web.Mvc.ViewPage

我使用的是TopicFormViewModel,因为我会随模型一起发送附加数据

Post(Details)视图只是继承了
System.Web.Mvc.ViewPage

现在,我已经创建了一个局部视图(CreatePost.ascx),它(显然是:p)用于创建一篇新文章。我希望能够在上面看到的所有视图上重复使用此控件

更新
我已尝试从我的Topics/Index.aspx视图中使用
呈现局部视图,但这会导致异常

传递到字典的模型项的类型为“System.Data.Linq.Table`1[MessageBoard.Models.Topic]”,但此字典需要类型为“MessageBoard.Models.Post”的模型项

现在的问题是,我的部分视图(CreatePost.ascx)接受
System.Web.Mvc.ViewUserControl
,我不确定如何从上面的所有视图传递它

我也不确定如何将.ascx值提交到某个URL(即/Topics/1/CreatePost),我如何告诉提交按钮将其提交到该URL

提前感谢,
马尔科

再见,马尔科

现在的问题是,我的部分 视图(CreatePost.ascx)接受 System.Web.Mvc.ViewUserControl 我不知道该怎么把它传出去 以上是我的观点

我不确定我是否理解你所说的“如何从我以上所有的观点中传递”是什么意思,但我确信你不必从你的观点中传递一个Post实例。现在的情况是,从视图中,您将调用一个控制器操作,该操作创建Post模型对象,然后将其绑定到CreatePost.ascx部分

我也不知道如何提交申请 .ascx值到某个URL(即。 /Topics/1/CreatePost),我该怎么说 要发布到该URL的提交按钮

您有两个选择:

在CreatePost.ascx部分中,您可能正在使用表单

<% using (Html.BeginForm("action", "controller", FormMethod.Post, new {} )) { %>
希望这有帮助


注意:为了能够重用CreatePost.ascx局部视图,请将其放在共享视图文件夹(母版页所在的位置)。

关于重用不在同一视图文件夹中的局部视图,请使用以下命令并传入所需的模型,或者您可以为其定义自定义路由

<% html.RenderPartial("~/Views/<ControllerName>/<PartialViewName>.ascx", <model>);
@Marko

另一种方法是在后控制器中执行如下操作:

[HttpGet]
public ActionResult CreatePost( int topicId ) {
    PostModel pm = _manager.CreateDefaultPost();
    pm.TopicID = id;
    return PartialView( "CreatePost", pm );
}
然后,无论你想在哪里创建一篇文章,你都可以简单地调用这个操作,为你的新文章返回强类型视图

即使您有一个通过网络IMO的补充http调用,该解决方案的优点是将新帖子的初始化代码集中在一个地方

从“视点”的角度来看,当用户按下“New Post”按钮,然后将收到的标记插入模式对话框或当前页面中您喜欢的位置时,可以调用操作


希望有帮助

你好@Lorenzo,谢谢你在
BeginForm
上的提示,我不知道它接受参数,所以我现在已经解决了这个问题。干杯关于另一个问题,请参阅我的更新。@Marko:如果从强类型化到MyObject类的视图中执行RenderPartial,框架将尝试将该对象的实例传递给RenderPartial方法。但是你的部分是强类型的另一个对象。。。您应该创建一个Post模型的实例,然后执行
无论如何,我想警告您,在视图中创建对象的实例不是正确的方法…请参阅我在上面回复@p.campbell时的评论。我现在接受你的回答,为你的帮助干杯@马克:好的!ViewData是处理作业的好方法。我发布了另一个答案,描述了另一种方法。很高兴知道这在某种程度上有所帮助呃,为什么投票失败?有人在开玩笑,似乎对我的问题投了否决票。
CreatePost
有什么表单元素?为什么它的类型是
Post
?这难道不是从头开始创建一个帖子的意义吗?因此这篇帖子还不存在?@p.campbell-你说得对。我想要通过一个模型的原因实际上是每个帖子都与一个主题相关联,我需要ID,这样我就可以在正确的位置创建帖子。我现在已经使用ViewData来完成这项工作,它似乎工作得很好。我唯一关心的是必须从页面上具有Add Post表单的每个控制器操作传递ViewData,但我可以处理这个问题。这是我的第一个项目,所以还在学习:)嘿@Dien,我的问题是将模型传递给渲染部分,而不是找到局部视图本身:)当然,没问题。我相信您知道这一点,但您可以将模型作为参数传递给局部视图。
[HttpGet]
public ActionResult CreatePost( int topicId ) {
    PostModel pm = _manager.CreateDefaultPost();
    pm.TopicID = id;
    return PartialView( "CreatePost", pm );
}