我有一个使用ContentPart创建的简单Widget。 ContentPart有适当的驱动程序,Widget可以放在我Orchard站点的任何地方,一切都很棒! Widget需要从用户捕获一些数据,验证它,处理它,然后在Widget中显示成功响应。
为了实现这一点,我已经定义了一个控制器,它接受一个POST请求,该请求将处理Model并返回相同的MyForm视图(如果它无效)或返回FormSuccess视图(如果它是有效的)。窗口小部件模板使用@Html.Partial("MyForm")
来显示包含Ajax表单的MyForm视图,该表单将使用POST响应更新包含div的Ajax表单。控制器将根据数据返回MyForm视图或FormSuccess视图。
我遇到的问题是我的设计师需要覆盖MyForm视图和FormSuccess视图的部分视图,他可以轻松覆盖Part显示模板而不是部分视图。
我认为目前无法做到这一点的原因是因为我正在使用@Html.Partial("MyForm")
。我发现如果我使用@Display(New.MyForm())
代替,我可以通过在当前主题的Views文件夹中创建一个名为MyForm.cshtml的文件来覆盖MyForm视图,这正是我需要的,但我该怎么做控制器操作中@Display
的等价物?
目前我正在做return this.PartialView("MyForm", model)
或return this.PartialView("FormSuccess")
这将使用原始视图而不是被覆盖的视图。我注意到有一个ShapeResult,但我不确定这是否是正确的做法,我不知道如何生成动态构造函数参数。理想情况下,我还需要MyForm视图有一个强类型模型,以便我可以使用HtmlHelper方法LabelFor,TextboxFor和ValidationMessageFor,当模型是动态模型时,这是不可能的吗?
之前是否有人做过类似的事情,或者有人可以提供任何指导吗?
谢谢, 杰森
答案 0 :(得分:0)
你尝试过这样的事吗?
public ActionResult YourAction(){
//where yourContent is a your widget content
//and _contentManager is IContentManager
dynamic model = _contentManager.BuildDisplay(yourContent);
return View((object)model);
}
答案 1 :(得分:0)
我设法通过改变我的模块编译方式来实现这一目标!我不完全理解这是如何起作用的,但它已经有了!
最初我尝试通过在当前主题的views文件夹中创建具有相同名称的文件来覆盖部分视图,这没有做任何事情,从那以后我一直尝试不同的方法。
我发现如果我强制我的模块被动态编译,那么来自themes文件夹的部分视图会覆盖我模块中的相关视图。以前我使用引用的模块加载器,因为我想调试我的模块,这是我实现它的唯一方法。
似乎在动态编译模块时会发生一些事情,将我的模块中的视图映射到主题中的覆盖视图!
这是解释模块加载的好link。