4

从过去的两天开始,我一直在努力寻找关于如何使用 DOTNETNUKE CMS 的 MVC 框架构建模块的清晰示例文档。

对于这种规模的 CMS 来说,首先宣传他们支持 MVC 的应用程序开发人员是非常不幸的,然后对于如何构建一个非常简单的表单开始的信息几乎可以忽略不计。

这就是我现在所取得的成就。我正在尝试建立一个基本的联系我们表格:

  1. 设置控制器动作

    // 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";
        }
    
    }
    
  2. 设置视图。

    <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 社区的来信。

4

1 回答 1

2

一个好的 DNN8 MVC 模块示例项目是我的Restaurant Menu MVC 项目,您可以从 github 下载。

我的编辑视图和控制器具有可以检查的带有工作验证的表单字段。

确保单击提交按钮时,它正在输入您的控制器方法(我假设该视图基于您的操作方法称为 FormEntry?)。

此外,处理帖子的操作方法应返回操作结果,而不是字符串。

在我的 post 处理程序中,如果 ModelState.IsValid 为真,我会在持久化表单数据后返回一个 RedirectToRouteResult,否则我将返回具有相同模型的当前视图,这将触发验证。

[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);
}
于 2016-05-10T00:59:30.607 回答