此代码位于母版页内:
Run Code Online (Sandbox Code Playgroud)<li><a href="<%=Url.Action("Action", "Controller") %>">Main site link</a></li> <li><a href="<%=Url.Action("AreaAction", "AreaController", new {area = "Area"}) %>">Area link</a></li>
所有的链接都很好,直到我去区域链接.当我去那里时,主要区域的所有路线都不起作用.
为了解决这个问题,我可以使用它:
Run Code Online (Sandbox Code Playgroud)<li><a href="<%=Url.Action("Action", "Controller", new {area = ""}) %>">Main site link</a></li>
我的问题是,有没有办法避免, new {area = ""}在主站点的每个链接?
在网站的每个链接上都有这个非常烦人.
我目前正在开发一个ASP.NET MVC 4 Web应用程序项目,该项目必须遵循以下设计决策:
所有区域中的所有普通控制器(包括根)都按预期工作.但是,我的一些Web API控制器出现意外行为.例如,有两个具有相同名称但位于不同区域的Web API控制器会产生以下异常:
找到了多个匹配名为"clients"的控制器的类型.如果为此请求提供服务的路由('api/{controller}/{id}')发现多个控制器定义了相同名称但名称不同的命名空间(不受支持),则会发生这种情况.
对'clients'的请求找到了以下匹配的控制器:MvcApplication.Areas.Administration.Controllers.Api.ClientsController MvcApplication.Controllers.Api.ClientsController
这看起来很奇怪,因为我有不同的路线,应该将两者分开.这是我的管理部门的区域注册:
public class AdministrationAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Administration";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.MapHttpRoute(
name: "Administration_DefaultApi",
routeTemplate: "Administration/api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
context.MapRoute(
"Administration_default",
"Administration/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我注意到我可以访问区域特定的Web API,同时省略呼叫区域的名称.
这里发生了什么?如何让我的Web API控制器像普通的ASP.NET MVC控制器一样运行?
我对使用区域的好处和它们的必要性有疑问.
我看到一些对立面:
在mvc应用程序中确实需要区域,因为它们迫使我们返回文件夹结构.
在asp mvc中使用区域的目标是什么?使用区域有哪些好处.
我有一个大型应用程序,目前作为WebForms和MVC 2.0的混合体存在.启动我的应用程序是可怕的,罪魁祸首主要是因为AreaRegistration.RegisterAllAreas调用.更具体地说,它使用System.Web. Compilation.BuildManager.GetReferencedAssemblies枚举应用程序直接引用的程序集中的所有类型并测试它们以查看它们是否派生自AreaRegistration.
不幸的是,我有许多第三方程序集恰好相当广泛,所以这个初始加载可能非常糟糕.如果我可以告诉它要查找哪些程序集AreaRegistrations,或者甚至手动注册区域,我会得到更好的结果.
我可以收集所有内部AreaRegistration创建和调用注册,但我只是好奇其他人是否已经解决了这个问题.
我想创建一个嵌套区域的项目结构.例如,我有一个"Home"区域,在这下面我想要"新闻"区域来处理它自己的路线注册,并且当路线指向"新闻"区域中的控制器时将正确查找视图.通过将"新闻"区域名称更改为"主页/新闻"而不是简单地"新闻",可以找到正确的视图.在主要的Global.asax.cs中,我实例化所有区域("Home"和"News")并单独注册它们,因为RegisterAllAreas()函数只找到一层深的区域(即它只找到并注册"Home" "地区".
有没有其他人尝试类似的东西?这是一个主要的黑客攻击还是一个稳定的长期解决方案?您提供的任何建议都非常感谢.
我在我的asp.net mvc 3解决方案中创建了一个名为admin的新区域.Visual Studio自动分配名称空间:
MyApp.areas.admin.controllers
Run Code Online (Sandbox Code Playgroud)
我改成这个 MyApp.admin.controllers
但它停止解决行动.
在这方面的任何帮助将不胜感激.
谢谢
我正在尝试使用许多插件创建一个MVC4 Web应用程序,即基本上通过MEF导出的控制器以及解压缩到其正确位置的内容文件.我找到了很多关于MVC插件的资料,主要涉及领域,但我不得不放弃MvcContrib,这将是最明显的解决方案,因为它似乎不再开发,显示了最新的MVC位的一些问题,我也喜欢这种架构的最简单复杂的实现.
因此我的要求是:
a)一个基于MEF的MVC插件解决方案,我只是在我的站点中删除一个包以供它使用,理想情况下甚至没有重启.这意味着将插件存储在与Bin不同的文件夹中,这也提供了更好的隔离.
b)符合IoC工具的解决方案比仅由MEF完成的解决方案更完整.我倾向于使用Autofac,因为它与MEF和MVC4(此时为RC)集成.
除了像视图这样的内容之外,其基本任务是让MVC在MEF插件中定位控制器并实例化它们,所以我需要一个控制器工厂.我在这里发现了一篇很好的文章:http://kennytordeur.blogspot.be/2012/08/mef-in-aspnet-mvc-4-and-webapi.html(我联系了Kenny关于这一点,我感谢他的指点我到一些路由问题).作者还将他的代码包装成一个方便的nuget包(MEF.MVC4).无论如何,我发现了一个似乎与路由和名称空间有关的问题:当遇到一个到插件控制器的路由时,MEF控制器工厂的GetControllerInstance方法得到一个空的controllerType,最终导致404.我想我可能找到了罪魁祸首通过阅读这些帖子:
http://blog.davebouwman.com/2011/12/08/asp-net-mvc3-and-404s-for-area-controllers/
和
自定义控制器工厂,ASP.NET MVC的依赖注入/结构图问题
我想(但我可能错了)问题出在路由约定和插件区域控制器命名空间中:插件控制器的命名空间不在主机Web的同一"根"中.该帖子中提出的解决方案只是为Web应用程序添加了一条新路径,但这不适用于区域作为插件工作的动态添加到主机应用程序的解决方案.我的主机网络应用程序必须保持不知道插件,这当然应该是一个相当普遍的要求,但我找不到明显的解决方案.
您可以快速创建repro解决方案,以便按照以下步骤查看我的方法的详细信息,或从此处下载:
1)创建一个空白的解决方案.
2)在其中创建一个MVC4 Web应用程序(HostWeb),更新所有NuGet预装的包并添加Mef.MVC4,Autofac MVC 4(RC)和Autofac.Mef.在我的真实应用程序中,我想使用Autofac在构造函数中注入控制器的依赖项.
3)在HostWeb中创建一个Plugins文件夹,并在其中创建一个子文件夹Temp.这将包括使用Temp子文件夹作为卷影副本容器的插件,以便从中加载MEF目录而不是直接从插件加载.这与一些启动代码一起应该让我更新插件而不必重新启动Web应用程序(否则将锁定DLL).启动代码是一个名为PreApplicationInit的类,您可以在Infrastructure文件夹中找到该类(稍微修改自http://shazwazza.com/post/Developing-a-plugin-framework-in-ASPNET-with-medium-trust.aspx).
4)将一个部件区域添加到主机Web并从视图根文件夹中复制_ViewStart文件(并更改布局视图中的现有链接,以便将空白区域添加到路径值,以便它们不会被破坏) .所有插件控制器都将命名空间到名为Parts的区域中.主机Web应用程序有一个没有控制器的区域,只是为插件内容文件准备文件夹结构和路由(视图,将从插件安装程序模块解压缩到正确的位置,而二进制文件将放在插件中).
5)在HostWeb的App_Start中定制MefConfig并添加处理Autofac的IocConfig.然后向全局asax添加对两者的调用:MefConfig.RegisterMef()和IocConfig.RegisterDependencies().
6)在其中创建另一个MVC4 Web应用程序(AlphaPlugin),更新所有NuGet预安装包并添加Autofac MVC 4(RC)和Autofac.Mef.我选择了一个Web应用程序模板(而不是类库),因此我可以使用MVC的所有VS工具,并最终直接在那里进行一些测试.
7)将一个部件区域添加到主机Web,并从views根文件夹中将_ViewStart文件复制到其中.
8)在"部件"区域中添加可导出的控制器.我叫做AlphaController,它只有一个名为Hail的动作方法,它在ViewBag中放入一个字符串并返回默认视图.
9)回到主机,只需在主视图中添加插件控制器动作的链接,即可通过MEF进行测试.
现在,如果我构建所有并将AlphaPlugin.dll二进制文件复制到HostWeb Plugins文件夹中,我希望MVC通过MEF找到它,但随后抛出一个未查找的错误错误,因为我还没有复制主机网络中的任何内容文件.相反,我得到以下内容:
Value cannot be null.
Parameter name: type
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the …Run Code Online (Sandbox Code Playgroud) 我知道在控制器顶部的MVC中,您可以使用该[Authorize()]属性将对整个控制器的访问限制为某些经过身份验证的用户和/或角色,但不能通过IP限制,但这必须在每个控制器实例上完成.有没有办法将对整个MVC区域的访问限制为经过身份验证的用户/角色或请求源IP?
我已经为我的web api 2项目创建了一个帮助区域文档(基于owin/katana).我打开配置中的所有设置并安装Microsoft.AspNet.WebApi.OData.目前我有以下设置:
config.SetSampleObjects(new Dictionary<Type, object>
{
{typeof(string), "sample string"},
{typeof(IEnumerable<string>), new string[]{"sample 1", "sample 2"}}
});
config.SetSampleForMediaType(
new TextSample("Binary JSON content. See http://bsonspec.org for details."),
new MediaTypeHeaderValue("application/bson"));
config.SetSampleForType("[0]=foo&[1]=bar", new MediaTypeHeaderValue("application/x-www-form-urlencoded"), typeof(IEnumerable<string>));
config.SetSampleRequest("1234", new MediaTypeHeaderValue("text/plain"), "Values", "Put");
config.SetSampleResponse(new ImageSample("../images/aspNetHome.png"), new MediaTypeHeaderValue("image/png"), "Values", "Get", "id");
config.SetActualRequestType(typeof(string), "Values", "Get");
config.SetActualResponseType(typeof(string), "Values", "Post");
Run Code Online (Sandbox Code Playgroud)
但是,我没有生成任何响应样本.我的网页看起来像我在网上看到的那样
但它就像这样松散.如何显示JSON等样本响应格式,如第一张图片所示?
c# documentation asp.net-mvc-areas asp.net-web-api asp.net-web-api2
我尝试向我的 .NET Core 项目添加一个区域,但我总是看到该错误:
RouteCreationException:创建名称为“(我的区域名称)”的路线时出错
我的代码是:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "custom",
template: "{area:my area name}/{{controller=AdminHome}/{action=Index}/{id?}");
});
}
Run Code Online (Sandbox Code Playgroud)
在配置服务中,我添加了以下代码:
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddRouting();
//...
}
Run Code Online (Sandbox Code Playgroud)
在控制器中我添加了:
[Area("My Area Name")]
public class AdminHomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:
RouteCreationException:创建名称为“custom”且模板为“{area:area name}/{{controller=Home}/{action=Index}/{id?}”的路由时出错。\r\n Microsoft.AspNetCore.Routing.RouteBase..ctor(string template, string name, IInlineConstraintResolver constraintResolver, …
asp.net-mvc ×5
c# ×4
.net ×3
asp.net ×1
asp.net-core ×1
autofac ×1
mef ×1
razor ×1
razor-2 ×1
registration ×1