将模型传递回页面

时间:2015-10-12 13:54:32

标签: c# asp.net-mvc asp.net-mvc-4 umbraco7

想知道是否有人可以帮助我......

基本上我想要做的就是在发布表单时,我正在做一些自定义验证,如果提交的数据不符合业务,那么我想停止处理(显然!并将传入的模型传递回包含表单的视图,以便用户不必重新键入所有数据。

我设置的方式是(这是使用Umbraco作为CMS):

1)我创建了模型/属性。 2)然后我创建了一个强类型的局部视图,并选择了我刚刚创建的模型类(名为AwardsCeremony) 3)然后我创建了一个带有以下Index ActionResult的控制器:

    public ActionResult Index()
    {
        TempData["priceList"] = getPrices();
        TempData["qualificationList"] = getQualifications();

        return PartialView("AwardsCeremony", new AwardsCeremonyViewModel());
    }

4)然后在Umbraco模板中我正在调用控制器

@Html.Action("Index", "AwardsCeremonySurface")

(这个umbraco从Master模板(在Umbraco中)继承了它的造型等。)。

在视图中(在HTTPPOST事件上)我在控制器上调用processBooking actionresult。

@using (Html.BeginUmbracoForm("processBooking", "AwardsCeremonySurface", null, new { @class = "form-horizontal" }))

然后,这个ActionResult会进行错误检查,这就是问题开始的地方(!),为了便于阅读,我删除了自定义验证。

    [HttpPost]
    public ActionResult processBooking(AwardsCeremonyViewModel model)
    {
        //Do the custom error handling

        if (myInvalidForm == true)
        {
            return PartialView("AwardsCeremony",model);
        }

        //Process the booking

        return RedirectToCurrentUmbracoPage();
    }

发生的事情是,当返回部分视图时,页面样式丢失,表单显示但没有Umbraco Master模板中的继承样式,类等,我只是不知道如何固定。有人能指出我正确的方向吗?

谢谢, 克雷格

2 个答案:

答案 0 :(得分:0)

在Umbraco中实现表单(基于我的一个项目中的代码 - 您在HandleContactUs中的表单处理很可能会有所不同):

模型只是标准的MVC。

控制器:

public class FormsController : SurfaceController
{
    [ChildActionOnly]
    public ActionResult ContactUs()
    {
        HtmlHelper.UnobtrusiveJavaScriptEnabled = true;
        HtmlHelper.ClientValidationEnabled = true;

        ContactForm model = null;
        if (TempData.ContainsKey("ContactForm"))
        {
            model = TempData["ContactForm"] as ContactForm;
        }
        if (model == null)
        {
            model = new ContactForm { Page = CurrentPage };
        }
        return PartialView(model);
    }

    [HttpPost]
    public ActionResult HandleContactUs(ContactForm model)
    {
        if (ModelState.IsValid)
        {
            string errorMsg = string.Empty;

            TempData["ContactFormSuccess"] = model.SendMail(Umbraco, out errorMsg);
            TempData["ContactFormErrorMessage"] = errorMsg;
        }
        else
        {
            TempData["ContactFormSuccess"] = false;
        }
        TempData["ContactForm"] = model;

        if (!Request.IsAjaxRequest())
            RedirectToCurrentUmbracoUrl();

        return PartialView(model);
    }
}

备注

  1. 表单由ContactUs操作呈现,同时由HandleContactUs发布操作处理。
  2. 处理程序操作检查ajax帖子 - 如果它没有回发,那么我们做RedirectToUmbracoUrl()否则我们只返回部分视图,因为我们使用javascript将表单替换为处理后的视图(通常是感谢你留言等。)
  3. 您实际上不需要在控制器名称中包含关键字Surface - 虽然文档仍然表明您这样做,但它已经在一段时间之前被删除了。
  4. 观点:

    〜\视图\形式\ ContactUs.cshtml:

    使用标准的UmbracoBeginForm:

    @using (Html.BeginUmbracoForm<FormsController>("HandleContactUs", null, 
            new { @class = "form-horizontal" })) 
    {
    
    }
    

    使用MS MVC Ajax.BeginForm:

    @using (Ajax.BeginForm("HandleContactUs", "Forms", null,  
            new AjaxOptions { UpdateTargetId = "contactForm", 
                              OnBegin = "contactBegin", 
                              OnFailure = "contactFailure" }, 
            new { @class = "form-horizontal" }) ) 
    {
    
    }
    

    当然,您还需要javascript回调函数contactBegincontactFailure或者您的AjaxOptions配置。

    我已经在几个项目中使用了这种方法而没有任何问题。

答案 1 :(得分:-1)

当然造型丢失了。您确实将部分视图作为响应返回,而不包括您的站点布局。您想要返回完整的default_charset = "iso-8859-1"; ,即ViewResult,该视图应与您用于GET操作的视图相同,而不是部分视图。