我无法让我的自定义控制器在Umbraco MVC网站中正常运行。我无法弄清楚如何传递自定义模型并使用自定义ActionResults。当我尝试发送表单时,该方法未被调用。所以像这样的方法
public ActionResult Home(string username, string password)
{
Debug.WriteLine("form");
var company = new Company();
return CurrentTemplate(company);
}
应该从这样的形式调用,但没有任何反应。
@using (Html.BeginForm("Home","Login", FormMethod.Post, new {name = "logon"}))
{
<label>User name </label><input type="text" id="username"/><br/>
<label>Password </label><input type="password" id="password"/><br/>
<input type="submit" value="Here"/>
}
我知道可以覆盖默认控制器但这样做有什么意义吗?
答案 0 :(得分:2)
旧帖子,但我想我会在当前正在进行的项目中添加我的发现。
对于帖子,正如您在表单中所指的那样,对于大多数情况,您需要一个SurfaceController,如@Digbyswift所说。
HOWEVER - 这是我遇到的最麻烦的地方。我有一个表单发布到另一个页面,显示结果,然后在视图上显示该数据。我想放弃使用query strings
并将数据放入session
等,因为我们正在使用MVC
。这也允许我返回使用CurrentPage
的自定义视图,您需要RenderModel
作为model
。我们需要设置一些东西:
1)创建控制器,视图和文档类型。在这种情况下,我正在处理w /&#34;成员&#34;,因此我创建了Member
doc类型,MemberController
等。
2)关于发布到表单的观点:
<form method="post" action="member">
<div class="form-group">
<input type="text" id="query" name="query" class="form-control" placeholder="Member Company or State" />
</div>
<input type="submit" value="Search" class="button button-green" />
</form>
您还可以在继承自ApplicationEventHandler
类的类中定义自定义路由,并在ApplicationStarted
事件中注册路由,但这样我们只会覆盖{{1行动。
3)在控制器上Index
MemberController
如果您没有需要渲染的任何public class MemberController : RenderMvcController
{
[EnsurePublishedContentRequest(2303)] // 2303 is your node ID
public ActionResult Index(string query)
{
// your code - assign to ViewBag
return View("~/Views/Member.cshtml", this.CreateRenderModel(Umbraco.TypedContent(2303)));
}
}
private RenderModel CreateRenderModel(IPublishedContent content)
{
var model = new RenderModel(content, CultureInfo.CurrentUICulture);
//add an umbraco data token so the umbraco view engine executes
RouteData.DataTokens["umbraco-doc-request"] = model;
return model;
}
,则不要必须这样做。在我的情况下,我有这个继承了_layout的观点。
我们必须做(2)这里的事情。一个是确保我们获得macros
。
第二部分是获取PublishedContentRequest
对象。我阅读了很多文章,其中你的基础模型应该从RenderModel
继承,并添加一些默认的Umbraco构造函数,但我没有太多运气。
希望这有助于某人。
答案 1 :(得分:1)
你真的是说你想要一个自定义控制器,或者你真的只想在Umbraco中使用MVC创建一个表单吗?如果它是后者那么你需要使用surface controller即。确保您的控制器继承自Umbraco.Web.Mvc.SurfaceController
并具有后缀&#39; SurfaceController&#39;。
public class MySurfaceController : Umbraco.Web.Mvc.SurfaceController
{
public ActionResult Index()
{
return Content("hello world");
}
}
然后,您需要使用自定义Umbraco Html帮助程序来创建表单标记:
@using(Html.BeginUmbracoForm("CreateComment", "BlogPostSurface"))
{
//
}
答案 2 :(得分:1)
在Umbraco中,每个请求都会通过Umbraco.Web.Mvc.RenderMvcController
进行路由,但您可以覆盖此documentation is here。
但是,我建议如果您觉得需要这样做,那么您可能会过度复杂化您的实现。您仍然可以使用您的方法渲染ChildActions,可以为Umbraco页面模型提供独立的模型。 See here。这非常适合渲染分页搜索结果,文档列表和您希望能够在控制器中控制的内容。我经常使用这种方法,但总是尝试传回一个以IPublishedContent
界面为中心的模型(例如IEnumerable<IPublishedContent>
用于页面列表),这样在View中,你仍然可以访问Umbraco来自View的内容和API,而不必在模型中实现太多自己的属性。
当发布表单时,它有点棘手,因为你有两个选择:
Html.BeginUmbracoForm()
方法;或[HttpPost]
行动,即Html.BeginForm()
。(2)的挑战是因为所有请求都是通过Umbraco.Web.Mvc.RenderMvcController
传递的,所以你无法告诉表单要发布哪个页面。您只能发布自己或非Umbraco控制的操作。例如,您可以让表单回发到同一页面,并为[HttpPost]
专门设置第二个ChildAction。这个问题是它会捕获所有帖子,无论从哪个表单发布。
就个人而言,我使用大多数标准形式的方法(1),我需要直接与Umbraco互动,例如查询,上传等,当我需要更多控制时,我使用方法(2)。但这通常需要更多的思考。