gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 路由参数不适用于区域

转载 作者:行者123 更新时间:2023-12-02 20:00:36 25 4
gpt4 key购买 nike

我目前正在研究区域并在其中进行路由。我想要实现的是能够拥有一个如下所示的 URL;

PracticeAdmin/Practice/[Practice Name]

然后我就可以在其末尾添加诸如“编辑”和“删除”之类的内容。

我过去在不处理区域时通过将此注释添加到操作中实现了这一点

[Route("PracticeAdmin/Practices/{practiceName}")]
public ActionResult Details(string practiceName)

这将产生我想要的 URL。我遇到的问题是,当我尝试在使用区域时执行此操作时,我会得到如下所示的链接;

PracticeAdmin/Practices?practiceName=Practice1

这不是我想要的。

我用来尝试生成此代码的代码是

PracticeAdminAreaRegistration.cs

using System.Web.Mvc;

namespace TrainingPortal.Areas.PracticeAdmin
{
public class PracticeAdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "PracticeAdmin";
}
}

public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"PracticeAdmin_default",
"PracticeAdmin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new[] { "TrainingPortal.Areas.PracticeAdmin.Controllers" }
);
}
}
}

RouteConfig.cs

namespace TrainingPortal
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapMvcAttributeRoutes();

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "TrainingPortal.Controllers" }
);
}
}
}

我在这里调用了 MapMvcAttributeRoutes,我相信这应该意味着即使在区域内也可以注册路由。我还尝试将必要的代码放入 PracticeAdminAreaRegistration 中以执行相同的操作,但没有效果。

PracticeAdminController.cs

namespace TrainingPortal.Areas.PracticeAdmin.Controllers
{
public partial class PracticesController : Controller
{
private TpContext db = new TpContext();

// GET: PracticeAdmin/Practices
public virtual ActionResult Index()
{
return View(db.Practices.ToList());
}

[Route("PracticeAdmin/Practice/{practiceName}")]
public virtual ActionResult Details(string practiceName)
{
if (string.IsNullOrWhiteSpace(practiceName))
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Practice practice = db.Practices.FirstOrDefault(m => m.PracticeName.ToLower() == practiceName);
if (practice == null)
{
return HttpNotFound();
}
return View(practice);
}
...

显然,它可以与其他方法一起使用,但它们都遵循与此相同的方法。

Index.cshtml 片段

@Html.ActionLink("Delete", MVC.PracticeAdmin.Practices.Delete(item.PracticeName))
@Html.ActionLink("Delete2", "Delete", new { practiceName = item.PracticeName })

在 PracticeAdminArea/Views/Practices/Index.cshtml 中,我尝试使用 T4MVC 和正常的 ActionLink 方法,它们生成完全相同的链接(毫不奇怪)。

摘要

我不知道为什么在尝试在某个区域中创建 ActionLink 时没有出现我指定的路线,所以我想知道是否有人能够向我指出如何解决此问题的方向并让 URL 看起来像我想要的那样?

最佳答案

经过一番尝试后,我成功让它工作了。我最终修复它的方法是在调用 MapMvcAttributeRoutes() 后从 RouteConfig.RegisterRoutes() 调用 AreaRegistration.RegisterAllAreas()

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapMvcAttributeRoutes();

AreaRegistration.RegisterAllAreas();

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "TrainingPortal.Controllers" }
);
}
}

由于您不允许两次调用此方法(或者 ASP.NET 对您两次注册相同的路由名称感到非常不安),因此我删除了对 AreaRegistration.RegisterAllAreas() 的调用Global.asax 让它看起来像这样;

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}

不幸的是,仅此并不能解决问题,我还必须对 Controller 进行一些修改。修改是向 Controller 添加 RoutePrefixRouteArea 属性,如下所示;

[RouteArea("PracticeAdmin")]
[RoutePrefix("Practice")]
public partial class PracticesController : Controller
{

这还有一个额外的好处,即通过 Route 属性指定特定操作的路由时,您不必再指定这些部分,因此最初操作的签名将如下所示;

// GET: PracticeAdmin/Practices/{practiceName}/Members
[Route("PracticeAdmin/Practices/{practiceName}/Members")]
public virtual ActionResult Members(string practiceName)
{

现在看起来像这样;

// GET: PracticeAdmin/Practices/{practiceName}/Members
[Route("{practiceName}/Members")]
public virtual ActionResult Members(string practiceName)
{

完成所有这些更改后,网站的行为符合预期。

关于asp.net-mvc - ASP.NET MVC 路由参数不适用于区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25962959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com