在过去的两天里,我一直在努力寻找有关如何使用DOTNETNUKE CMS的MVC框架构建模块的清晰且典范的文档。
非常不幸的是,这个规模的CMS首先宣传他们支持MVC的应用程序开发人员,然后接下来可以忽略不计的关于如何构建一个非常简单的表单的信息。
这是我现在所取得的成就。我正在尝试与我们建立基本的联系表格:
设置控制器操作
// GET: FormEntry Index ..
[ModuleAction(ControlKey = "Add", TitleKey = "AddItem")]
public ActionResult Index()
{
return View();
}
[HttpPost] // POST:
[ActionName("FormEntry")]
public string Post(FormEntry formEntry)
{
try
{
if (ModelState.IsValid)
{
FormEntryManager.Instance.CreateItem(formEntry);
}
return "success";
}
catch(Exception ex)
{
return "error";
}
}
设置视图。
<div id="Item-@Dnn.ModuleContext.ModuleId">
<form id="formcontactus">
@*@Html.ValidationSummary(true)*@
<fieldset>
<div class="dnnFormItem">
<div><label for="itemName">@Dnn.LocalizeString("lblName")</label></div>
@Html.TextBoxFor(m => m.VisitorName)
@Html.ValidationMessageFor(m => m.VisitorName, @Dnn.LocalizeString("VisitorNameRequired"))
</div>
<div class="dnnFormItem">
<div><label for="itemDescription">@Dnn.LocalizeString("lblVisitorEmail")</label></div>
@Html.TextBoxFor(m => m.VisitorEmail)
@Html.ValidationMessageFor(m => m.VisitorEmail, @Dnn.LocalizeString("VisitorEmailRequired"))
</div>
<div class="dnnFormItem">
<div><label for="itemDescription">@Dnn.LocalizeString("lblPhone")</label></div>
@Html.TextBoxFor(m => m.VisitorPhone)
</div>
<div class="dnnFormItem">
<div><label for="itemDescription">@Dnn.LocalizeString("lblMessage")</label></div>
@Html.TextAreaFor(m => m.VisitorMessage)
@Html.ValidationMessageFor(m => m.VisitorMessage, @Dnn.LocalizeString("VisitorMessageRequired"))
</div>
@Html.HiddenFor(m => m.ModuleId)
</fieldset>
<button id="btnSumbit" type="button" class="dnnPrimaryAction">@Dnn.LocalizeString("Submit")</button>
<a id="cancelEdit" href="#" class="dnnSecondaryAction">@Dnn.LocalizeString("Cancel")</a>
</form>
</div>
我的索引视图确实成功呈现,我可以看到我的表单。问题在于理解我将此数据发布到MVC Post方法的方式。此外,我的模态类上的验证数据注释在客户端也不起作用。
我尝试在Post方法上通过jQuery Ajax发布,但是会引发内部错误。
期待听到DNN社区的发言。
答案 0 :(得分:2)
一个好的DNN8 MVC模块示例项目是我的Restaurant Menu MVC project,您可以从github下载。
我的编辑视图和控制器的表单字段包含您可以查看的工作验证。
确保在单击提交按钮时,它正在输入您的控制器方法(我假设视图根据您的操作方法被称为FormEntry?)。
此外,处理帖子的操作方法应返回操作结果,而不是字符串。
在我的post处理程序中,如果ModelState.IsValid为true,则在保存表单数据后返回RedirectToRouteResult,否则我将使用相同的模型返回当前View,这将触发验证。
[HttpPost]
[DotNetNuke.Web.Mvc.Framework.ActionFilters.ValidateAntiForgeryToken]
public ActionResult Edit(MenuItem item)
{
if (ModelState.IsValid)
{
//Persist form information
//Go to default view (Index)
return RedirectToDefaultRoute();
}
// Return to my edit view if there was an error.
return View(item);
}