Частичное представление «SubmitForm» не найдено, или механизм представления не поддерживает искомые местоположения. Были обысканы следующие места:

Я новичок в 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 = "[email protected]";
                string fromAddress = "[email protected]";
                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>

Мой JavaScript для contactForm.js

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="#">[email protected]</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>

person Huzair Bahadur    schedule 25.12.2020    source источник
comment
проверьте свой путь, частичное представление должно находиться внутри папки контроллера или внутри общей папки, я бы поместил их в раздел Views/Shared/{_partialView}   -  person Sabir Hossain    schedule 26.12.2020


Ответы (2)


Где находится ваша часть «SubmitForm»? У вас есть представление с именем SubmitForm.cshtml в папке представления? Вот что запрашивает ошибка

Я предполагаю, что ошибка связана с вашим действием отправки формы, вам нужно украсить его атрибутом [httppost] или [httpget]?

Он должен вызывать _Result.cshtml, но я предполагаю, что это действие не выполняется.

person Jon Jones    schedule 26.12.2020

Вы не можете использовать обычный помощник MVC BeginForm с Umbraco. Чтобы создать форму, которая отправляется в SurfaceController, вам необходимо использовать:

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

Если вы хотите отправить Ajax, вам нужно создать собственный JS-скрипт. и вы не можете использовать помощник Ajax MVC.

Взгляните на документы: https://our.umbraco.com/documentation/reference/templating/mvc/forms

person Mario Lopez    schedule 03.01.2021