首页 > 解决方案 > 如何阻止 BeginForm() 引用 ASP.NET Core MVC 应用程序中的区域?

问题描述

我正在创建一个在任何区域之外的联系页面,但是当我使用@Html.BeginForm帮助程序时,它会继续添加我的一个区域的名称。

我的控制器位于 /contact/index

public class ContactController : Controller
{
        public IActionResult Index()
        {
            var contactForm = new ContactFormViewModel();
            return View(contactForm); 
        }

        [HttpPost]
        public IActionResult SendEmail(ContactFormViewModel contactFormInfo)
        {
            // send email code
            return View();
        }
}

Index的联系方式:

@model ContactFormViewModel
@{
    ViewData["Title"] = "Contact";
    ViewData["PageName"] = "contact_index";
    ViewData["Heading"] = "<i class='fal fa-info-circle'></i> Contact";
    ViewData["PageDescription"] = "Please reach out and let us know how you're doing";
}

<div class="fs-lg fw-300 p-5 bg-white border-faded rounded mb-g">

    @using (@Html.BeginForm("SendEmail", "Contact", new { area = "" }))
    {
        // Name
        <div class="form-group">
            @Html.LabelFor(x => x.FirstName, "First Name")
            @Html.TextAreaFor(x => x.FirstName, new { @class = "form-control" })
        </div>
        // Email
        <div class="form-group">
            @Html.LabelFor(x => x.Email, "Email")
            @Html.TextAreaFor(x => x.Email, new { @class = "form-control" })
        </div>
        // Category
        <div class="form-group">
            @{
                var list = new List<SelectListItem>()
                {
                    new SelectListItem("Common", ContactFormViewModel.InquiryType.Common.ToString()),
                    new SelectListItem("Question", ContactFormViewModel.InquiryType.Question.ToString()),
                    new SelectListItem("Error", ContactFormViewModel.InquiryType.Error.ToString()),
                    new SelectListItem("Advertising", ContactFormViewModel.InquiryType.Advertising.ToString()),
                    new SelectListItem("Other", ContactFormViewModel.InquiryType.Other.ToString()),
                };

            }
            @Html.LabelFor(x => x.ContactType, "Contact Type")
            @Html.DropDownListFor(x => x.ContactType, list, new { @class = "form-control"})
        </div>
        // Body
        <div class="form-group">
            @Html.LabelFor(x => x.Message, "Message")
            @Html.TextAreaFor(x => x.Message, new { @class = "form-control" })
        </div>

        // Submit
        <button type="submit" class="btn btn-primary">Submit</button>
    }

</div>

点击“提交”总是发回给:/fantasyfootball/Contact/SendEmail

<form action="/fantasyfootball/Contact/SendEmail" method="post"></form>

不确定这是否重要,但这是我的 startup.cs 路由配置:

// Route for printable sheets since they have the /cheatsheet/ static portion
endpoints.MapControllerRoute(
                    name: "FantasyFootballPrintable",
                    pattern: "{area:exists}/{controller=printable}/cheatsheet/{action=index}");

// The generic route for the Fantasy Football Route
endpoints.MapControllerRoute(
                    name: "FantasyFootball",
                    pattern: "{area:exists}/{controller=cheatsheet}/{action=custom}/{id?}");

// Setting the default route in the area
endpoints.MapControllerRoute(
                    name: "DefaultFantasyFootball",
                    pattern: "{area=fantasyfootball}/{controller=cheatsheet}/{action=custom}/{id?}");

endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=HtmlHelper}/{action=Index}/{id?}");

标签: c#.net-coreasp.net-core-mvc

解决方案


您可以使用 BeginRouteForm 方法代替 BeginForm 方法。它将生成操作链接:

表单动作="/Contact/SendEmail" 方法="post"

这是一个示例。希望能帮到你,我的朋友:))

@model MvcCore5.ViewModels.ContactFormViewModel
@{
    
}

<div class="fs-lg fw-300 p-5 bg-white border-faded rounded mb-g">

    @using (Html.BeginRouteForm(
         routeName: "default",
         method: FormMethod.Post,
         routeValues: new { action = "SendEmail", controller = "Contact", area = "" }
         ))
    {
        // Name
        <div class="form-group">
            @Html.LabelFor(x => x.FirstName, "First Name")
            @Html.TextAreaFor(x => x.FirstName, new { @class = "form-control" })
        </div>
        // Email
        <div class="form-group">
            @Html.LabelFor(x => x.Email, "Email")
            @Html.TextAreaFor(x => x.Email, new { @class = "form-control" })
        </div>        
        // Body
        <div class="form-group">
            @Html.LabelFor(x => x.Message, "Message")
            @Html.TextAreaFor(x => x.Message, new { @class = "form-control" })
        </div>

        // Submit
        <button type="submit" class="btn btn-primary">Submit</button>
    }

</div>

推荐阅读