C# 如何阻止BeginForm()引用ASP.NET核心MVC应用程序中的区域?

C# 如何阻止BeginForm()引用ASP.NET核心MVC应用程序中的区域?,c#,.net-core,asp.net-core-mvc,C#,.net Core,Asp.net Core Mvc,我正在创建一个任何区域之外的联系人页面,但是当我使用@Html.BeginForm帮助程序时,它会继续添加我的一个区域的名称 我的控制器位于/contact/index public class ContactController : Controller { public IActionResult Index() { var contactForm = new ContactFormViewModel(); re

我正在创建一个任何区域之外的联系人页面,但是当我使用
@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();
        }
}
我的
索引
联系人视图:

@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>
不确定这是否重要,但以下是我的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?}");

您可以将
default
端点放在顶部。实际上,在
DefaultFantasyFootball

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

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?}");

            

您可以将
default
端点放在顶部。实际上,在
DefaultFantasyFootball

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

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?}");

            

您可以使用BeginRouteForm方法而不是BeginInform方法。 它将生成操作链接:

form action=“/Contact/sendmail”method=“post”

这是一个样本。希望能帮上忙,我的朋友:))

@model MvcCore5.ViewModels.ContactFormViewModel
@{
}
@使用(Html.BeginRouteForm)(
路由名称:“默认值”,
方法:FormMethod.Post,
routeValue:new{action=“sendmail”,controller=“Contact”,area=”“}
))
{
//名字
@Html.LabelFor(x=>x.FirstName,“First Name”)
@TextAreaFor(x=>x.FirstName,新的{@class=“form control”})
//电子邮件
@Html.LabelFor(x=>x.Email,“Email”)
@Html.TextAreaFor(x=>x.Email,新的{@class=“form control”})
//身体
@LabelFor(x=>x.Message,“Message”)
@TextAreaFor(x=>x.Message,新的{@class=“formcontrol”})
//提交
提交
}

您可以使用BeginRouteForm方法而不是BeginInfo方法。 它将生成操作链接:

form action=“/Contact/sendmail”method=“post”

这是一个样本。希望能帮上忙,我的朋友:))

@model MvcCore5.ViewModels.ContactFormViewModel
@{
}
@使用(Html.BeginRouteForm)(
路由名称:“默认值”,
方法:FormMethod.Post,
routeValue:new{action=“sendmail”,controller=“Contact”,area=”“}
))
{
//名字
@Html.LabelFor(x=>x.FirstName,“First Name”)
@TextAreaFor(x=>x.FirstName,新的{@class=“form control”})
//电子邮件
@Html.LabelFor(x=>x.Email,“Email”)
@Html.TextAreaFor(x=>x.Email,新的{@class=“form control”})
//身体
@LabelFor(x=>x.Message,“Message”)
@TextAreaFor(x=>x.Message,新的{@class=“formcontrol”})
//提交
提交
}

此解决方案有效。看起来助手使用第一个非忽略路由来生成链接。如果结果是重新排列路线会干扰我现有的导航,我将不得不使用BeginRouteForm,因为@Tomato32建议此解决方案有效。看起来助手使用第一个非忽略路由来生成链接。如果结果是重新排列路线会影响我现有的导航,我将不得不使用@Tomato32建议的BeginRouteForm
@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>