我创建了一个区域,可以处理我们所有开发产品中的一些通用的东西,就像登录,HTML帮助器等.在该区域内,我有一个局部视图,我试图在该区域之外引用.我已经注册了该地区
public class Routes : AreaRegistration
{
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Common_default",
"Common/{controller}/{action}/{id}",
new {
controller = "Account",
action = "Index",
id = UrlParameter.Optional
});
}
public override string AreaName
{
get { return "MvcCommons"; }
}
}
Run Code Online (Sandbox Code Playgroud)
现在在常规项目中,我试图在MvcCommons区域中引用一个视图......
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>TestGrid</h2>
<% Html.RenderPartial("jQGridTable", ViewData.Model); %>
Run Code Online (Sandbox Code Playgroud)
但我一直认为没有找到视图.之前,在创建MVC Commons项目时,我收到了查看错误,但错误告诉我它在区域文件夹和默认视图文件夹中都有查看.这次,我只获取默认文件夹.有没有办法实现这个目标?
感谢大家!
我想要一个MVC区域独有的自定义错误页面.不幸的是,似乎Web.config覆盖系统没有考虑MVC文件夹结构.如果我想覆盖一个名为"mobile"的区域,我必须创建一个名为"mobile"的根项目文件夹(在视图和控制器中),并将Web.config放在那里,并使用新customErrors元素.
有没有更好的方法来执行此操作,以便我不必为任何覆盖创建根文件夹?
我刚刚创建了一个全新的ASP.NET MVC 4解决方案并添加了3个区域,并希望它们按照指示进行路由:
1. General -> http://www.mysite.com/
2. Members -> http://www.mysite.com/members/
3. Administration -> http://www.mysite.com/administration/
Run Code Online (Sandbox Code Playgroud)
我可以配置路由,以便"常规"区域在它是第一个段时起作用,但是当我不希望"常规"在URL中显示为段时,似乎无法让我的路由在所有3个区域中工作.正如您所看到的,我的目标是建立一个干净的URL结构.
我计划在每个区域下添加一些控制器/视图,并希望维护这个区域组织.
我已经看到了类似的MVC 2问题,但我不确定区域注册的顺序是否会纠正我的特定问题.
asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas asp.net-mvc-4
首先,我明白,MVC 3默认模板的Content文件夹不是强制性的css/img/etc.商店文件夹.
我仍然喜欢将Content文件夹的概念作为图像和样式表的"可引用"存储位置以及其他可能的东西(我还将整个jQuery自定义控件放入Content带有.js文件的子文件夹中).
Area到目前为止,我还没有在我的项目中使用过MVC ,因为我没有足够复杂的MVC .现在是时候了.
我正在考虑Content在每个文件夹中放置一个单独的文件夹Area.它会起作用吗?有什么"坏"可以摆脱它吗?像我一样无法通过它参考资源../Content/MyControl?或者MVC Area就像项目的根,但是一个单独的?
我刚刚在我的网站主机上部署了一个MVC4 .NET 4.0应用程序,用于"实时"部署测试.非区域路线工作正常,例如我的
@Html.ActionLink("Register as a Client", "Register", "Account", new { registrationType = "Client"}, null)
Run Code Online (Sandbox Code Playgroud)
链接工作正常,链接打开正确的页面.但是,通过指向基于区域的操作的链接,如下所示:
@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, null)
Run Code Online (Sandbox Code Playgroud)
实际呈现给浏览器的链接缺少动作和控制器,即
http://mylivedomain.com/?Area=Author®istrationType=Author
Run Code Online (Sandbox Code Playgroud)
值得注意的是,MVC4的css捆绑功能在部署后无法正常工作,我回过头来使用经典样式链接到各个样式表.
可能相关:我的问题:为什么我的MVC4应用程序中未经修改的模板代码尝试两次注册区域?
JUST IN:从区域路由映射中删除默认路由的默认操作解决了这个问题.在VS2012模板代码中没有默认控制器.
asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas asp.net-mvc-4
你能告诉我这两种实现的优缺点吗?
我的背景:我们有一个包含许多不同域名的大型项目.每个域自然都是一个区域.但是许多不同的团队将在每个团队中工作,我们希望将业务规则分开.在解决方案中管理这些问题的最佳方法是什么?
我在单独的项目或便携式区域看到了很多区域的例子.但我无法做出决定.
在我看来,我的观点是 :
单独的项目
便携式区域
谢谢,
目前我有一个像这样的文件夹结构:
Area (folder)
- Toolkit (folder)
- Controllers (folder)
- AdminController.cs
- Views (folder)
- Admin (folder)
- Privledges (folder)
- Create.cshtml
- Edit.cshtml
- Delete.cshtml
Run Code Online (Sandbox Code Playgroud)
这转化为
/Toolkit/{controller}/{action}/{tool}/{id}
Run Code Online (Sandbox Code Playgroud)
将操作设置为像控制器那样基于字符串{tool}参数和传递给操作的参数{id}来提供视图是不是一种不好的做法?
实现我所说的:
private const string FOLDER_PRIVILEGES = "./Privileges/";
public ActionResult Privileges(string tool, string id = "")
{
dynamic viewModel = null;
ToolViews view; // enum for the views
// Parse the tool name to get the enum representation of the view requested
bool isParsed = Enum.TryParse(tool, out view);
if (!isParsed)
{
return …Run Code Online (Sandbox Code Playgroud) 我在MVC4中有一个使用区域的网站.在某些区域(让我们称之为区域),我有一个控制器(控制器)与此操作:
public ActionResult Index()
{
return View();
}
public ActionResult OtherAction()
{
return View("Index");
}
Run Code Online (Sandbox Code Playgroud)
如果我像这样简单地重定向到Area/Controller/OtherAction,这很有用:
return RedirectToAction("OtherAction", "Controller", new { area = "Area" });
Run Code Online (Sandbox Code Playgroud)
但我需要(检查这里为什么)进行这样的重定向:
RouteData routeData = new RouteData();
routeData.Values.Add("area", "Area");
routeData.Values.Add("controller", "Controller");
routeData.Values.Add("action", "OtherAction");
ControllerController controller = new ControllerController();
controller.Execute(new RequestContext(new HttpContextWrapper(HttpContext.ApplicationInstance.Context), routeData));
Run Code Online (Sandbox Code Playgroud)
在那种情况下,它不起作用.在最后一行之后,执行OtherAction方法,然后在此代码的最后一行中抛出此异常:
未找到视图"索引"或其主数据或视图引擎不支持搜索的位置.搜索了以下位置:
〜/查看/控制器/ Index.aspx的
〜/查看/控制器/ Index.ascx
〜/查看/共享/的Index.aspx
〜/查看/共享/ Index.ascx
〜/查看/控制器/ Index.cshtml
〜/查看/控制器/ Index.vbhtml
〜/查看/共享/ Index.cshtml
〜/查看/共享/ Index.vbhtml
为什么会发生这种情况,我该如何解决?
我想避免打电话
AreaRegistration.RegisterAllAreas()
在我的global.asax中,因为我试图将所有启动逻辑移动到App_Start文件夹中的各个类中.但是,我没有成功地让它发挥作用.第一个选项尝试使用这样的代码:
[assembly: PreApplicationStartMethod(typeof(Startup), "PreInit")]
namespace Foo
{
public class Startup {}
}
Run Code Online (Sandbox Code Playgroud)
PreApplicationStartMethod来自System.Web名称空间的位置.在这种情况下,对寄存器区域的调用过早发生.
第二种方法基于David Ebbo的这篇文章,使用WebActivator:using System.Web.Mvc;
[assembly: WebActivatorEx.PostApplicationStartMethod
(typeof(AreaDemo.AreaConfig), "RegisterAreas")]
namespace AreaDemo
{
public class AreaConfig
{
public static void RegisterAreas()
{
AreaRegistration.RegisterAllAreas();
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,尽管没有抛出错误,但尝试导航到该区域失败(好像注册从未发生过).
使用程序集指令而不是从Global.asax直接调用,从启动类中注册ASP.NET MVC 5中的区域的正确方法是什么?
更新1:这是我的AreaRegistration代码:
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", …Run Code Online (Sandbox Code Playgroud) 在使用VS2017创建ASP.NET MVC Core Web应用程序时,遇到上下文菜单中缺少"添加区域"选项.
asp.net-mvc asp.net-mvc-areas .net-core asp.net-core visual-studio-2017
asp.net-mvc ×9
.net-core ×1
asp.net ×1
asp.net-core ×1
c# ×1
mvccontrib ×1
redirect ×1
routing ×1
webactivator ×1