【问题标题】:The partial view 'SubmitForm' was not found or no view engine supports the searched locations. The following locations were searched:未找到部分视图“SubmitForm”或没有视图引擎支持搜索的位置。搜索了以下位置:
【发布时间】:2020-12-25 20:00:25
【问题描述】:

我是 Umbraco 的新手,正在尝试建立并运行我的联系表。我得到的错误非常奇怪,我无法理解它。黄屏显示-

未找到部分视图“SubmitForm”或不支持视图引擎 搜索到的位置。搜索了以下位置:

为什么要寻找一个名为“SubmitForm”的部分内容以及如何修复它的任何建议?

我正在开发 Umbraco V8。我的代码如下:

ContactViewMode.cs:

using System.ComponentModel.DataAnnotations;

namespace Dhi_Quest.ViewModels
{
    public class ContactViewModel
    {
        [Required(ErrorMessage = "Please enter your name")]
        public string Name { get; set; }
        [Required(ErrorMessage ="Please enter your email address")]
        [EmailAddress(ErrorMessage ="You must enter a valid email address")]
        public string Email { get; set; }
        [Required(ErrorMessage ="Please enter your message")]
        [MaxLength(500, ErrorMessage ="Your message must be no longer than 500 characters")]
        public string Message { get; set; }


        public int ContactFormId { get; set; }
    }
}

ContactSurfaceController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Umbraco.Web.Mvc;
using Dhi_Quest.ViewModels;
using Umbraco.Web;
using System.Net.Mail;
using Umbraco.Core.Logging;

namespace Dhi_Quest.Controllers
{
    public class ContactSurfaceController : SurfaceController
    {
        private readonly ILogger _logger;
        public ContactSurfaceController(ILogger logger)
        {
            _logger = Logger;
        }

        [HttpGet]
        public ActionResult RenderForm()
        {
            ContactViewModel model = new ContactViewModel() { ContactFormId = CurrentPage.Id };
            return PartialView("~/Views/Partials/Contact/_ContactForm.cshtml", model);
        }

        [HttpPost]
        public ActionResult RenderForm(ContactViewModel model)
        {
            return PartialView("~/Views/Partials/Contact/_ContactForm.cshtml", model);
        }

        public ActionResult SubmitForm(ContactViewModel model)
        {
            bool success = false;

            if (ModelState.IsValid)
            {
                success = SendEmail(model);
            }

            var contactPage = UmbracoContext.Content.GetById(false, model.ContactFormId);

            var successMessage = contactPage.Value<IHtmlString>("successMessage");
            var errorMessage = contactPage.Value<IHtmlString>("errorMessage");

            return PartialView(("~/Views/Partials/Contact/_Result.cshtml", success ? successMessage : errorMessage));
        }

        public bool SendEmail( ContactViewModel model)
        {
            try
            {
                MailMessage message = new MailMessage();
                SmtpClient client = new SmtpClient();

                string toAddress = "to@test.com";
                string fromAddress = "from@test.com";
                message.Subject = $"Web Enquiry from: {model.Name} - {model.Email}";
                message.Body = model.Message;
                message.To.Add(new MailAddress(toAddress, toAddress));
                message.From= new MailAddress(fromAddress, fromAddress);
                client.Send(message);
                return true;
            }
            catch (Exception ex)
            {
                _logger.Error(typeof(ContactSurfaceController), ex, "Error sending contact form.");
                return false;
            }
        }
    }
}

_Result.cshtml 部分

@model   IHtmlString

@Modell

_ContactForm.cshtml 部分

@inherits UmbracoViewPage<ContactViewModel>

@using Dhi_Quest.ViewModels;
@using Dhi_Quest.Controllers;

@using ClientDependency.Core.Mvc

@{

    Html.EnableClientValidation();
    Html.EnableUnobtrusiveJavaScript();

    Html.RequiresJs("https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js");
    Html.RequiresJs("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js");
    Html.RequiresJs("~/Scripts/jquery.validate.min.js");
    Html.RequiresJs("~/Scripts/jquery.validate.unobtrusive.js");
    Html.RequiresJs("~/Scripts/jquery.unobtrusive-ajax.min.js");
    Html.RequiresJs("~/Scripts/contactForm.js");
}



<div id="form-outer">

    @using (Ajax.BeginForm("SubmitForm", "ContactSurface", new AjaxOptions()
    {
        UpdateTargetId = "form-result",
        HttpMethod = "POST",
        InsertionMode = InsertionMode.Replace,
        OnSuccess = "contactForm.showResult",
        OnFailure = "contactForm.showResult"
    }, new { id = "contact-form" }))
    {

        <div class="fields">
            <div class="field half">
                <label for="name">Name</label>
                @Html.TextBoxFor(m => m.Name, new { @id = "name", type = "text", name = "name", placeholder = "Enter your name" })
                @Html.ValidationMessageFor(m => m.Name)
                @*<input type="text" name="name" id="name" />*@
            </div>
            <div class="field half">
                <label for="email">Email</label>
                @Html.TextBoxFor(m => m.Email, new { @id = "email", type = "text", name = "email", placeholder = "Enter your email" })
                @Html.ValidationMessageFor(m => m.Email)
                @*<input type="text" name="email" id="email" />*@
            </div>
            <div class="field">
                <label for="message">Message</label>
                @Html.TextAreaFor(m => m.Message, new { @id = "message", name = "message", rows = "6", placeholder = "Type your message in 500 characters or less" })
                @Html.ValidationMessageFor(m => m.Message)
                @*<textarea name="message" id="message" rows="6"></textarea>*@
            </div>

            @Html.HiddenFor(m => m.ContactFormId)
        </div>
        <ul class="actions">
            <li><input type="submit" value="Send Message" class="primary contact-submit" /></li>
            <li><input type="reset" value="Clear" /></li>
        </ul>


    }

</div>

<div id="form-result">

</div>

我的contactForm.js JavaScript

var contactForm = contactForm ||
{
    init: function () {
        this.listners();
    },

    listners: function () {
        $(document).on('click', '.contact-submit', function () {
            e.preventDefault();
            var form = $("#contact-form");
            form.submit();
        })
    },

    showResult: function () {

        $('#form-outer').hide('slow');
        $('#form-result').show('slow'); 
    }

}

最终在 Contact_Us.cshtml 渲染它

@inherits Umbraco.Web.Mvc.UmbracoViewPage
@{
    Layout = "master.cshtml";
}

@using ClientDependency.Core.Mvc

@{

    Html.EnableClientValidation();
    Html.EnableUnobtrusiveJavaScript();

    Html.RequiresJs("https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js");
    Html.RequiresJs("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js");
    Html.RequiresJs("~/Scripts/jquery.validate.min.js");
    Html.RequiresJs("~/Scripts/jquery.validate.unobtrusive.js");
    Html.RequiresJs("~/Scripts/jquery.unobtrusive-ajax.min.js");
    Html.RequiresJs("~/Scripts/contactForm.js");
}

<!--Contact-->
<br />
<section id="contact">
    <div class="inner">
        <section>
            @{ Html.RenderAction("RenderForm", "ContactSurface");}
        </section>
        <section class="split">
            <section>
                <div class="contact-method">
                    <span class="icon solid alt fa-envelope"></span>
                    <h3>Email</h3>
                    <a href="#">test@test.com</a>
                </div>
            </section>
            <section>
                <div class="contact-method">
                    <span class="icon solid alt fa-phone"></span>
                    <h3>Phone</h3>
                    <span>1234567890</span>
                </div>
            </section>
            <section>
                <div class="contact-method">
                    <span class="icon solid alt fa-home"></span>
                    <h3>Address</h3>
                    <span>
                        Address line 1
                        Address line 2
                    </span>
                </div>
            </section>
        </section>
    </div>
</section>

【问题讨论】:

  • 检查你的路径,部分视图应该在控制器文件夹内或共享文件夹内,我将它们放在 Views/Shared/{_partialView}

标签: c# .net model-view-controller umbraco umbraco8


【解决方案1】:

您的“SubmitForm”部分在哪里?您在视图文件夹中有一个名为 SubmitForm.cshtml 的视图吗?这就是错误要求的内容

我猜错误是在你的提交表单操作上,你需要用 [httpget] 属性的 [httppost] 来装饰它吗?

它应该调用 _Result.cshtml 但我假设它没有触发该操作。

【讨论】:

    【解决方案2】:

    您不能在 Umbraco 中使用普通的 MVC BeginForm 助手。要创建提交给 SurfaceController 的表单,您需要使用:

    @using(Html.BeginUmbracoForm("SubmitForm", "ContactSurface"))
    {
        // your form here
    }
    

    如果您想进行 Ajax 提交,您必须创建自己的 JS 脚本。并且您不能使用 Ajax MVC 帮助器。

    查看文档:https://our.umbraco.com/documentation/reference/templating/mvc/forms

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 2015-04-24
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2020-06-29
      • 2017-03-09
      相关资源
      最近更新 更多