我们有一个处理艺术家和场地的网站,我们正在ASP.net MVC中开发它.
我们将艺术家视图放在文件夹(Views/Artists/..),ArtistsController,ArtistsRepository中,并遵守REST动作名称,如Show,New,Delete等.
当我们第一次模拟网站时,一切都在我们的测试环境中运行良好,因为我们的测试网址是/ artists/Show/1209但我们需要更改此网站,以便网站显示为/ artists/Madonna和/ artists/Foo-Fighters等
但是,我们如何区分有效的艺术家名称和该控制器的动作名称?!例如,艺术家/ PostComment或艺术家/ DeleteComment?我需要允许路由来处理这个问题.我们的默认Show路线是:
routes.MapRoute(
"ArtistDefault",
"artists/{artistName}",
new { controller = "Artists", action = "Show", artistName = ""}
Run Code Online (Sandbox Code Playgroud)
解决这个问题的一种方法是让我们的网站明显地运行/艺术家,但我们的控制器重命名为singular - ArtistController - 而不是ArtistsController.这会违背我们开始时的命名约定(但是嘿!).
你有其他建议吗?如果可能的话,我们也可以根据动词进行路由(因此PostComment将是一个POST,所以我们可以路由到该动作),但我不确定这是否可取,更不用说可能了.
谢谢
我们目前正在IIS6上运行,但希望尽快转移到IIS 7.
我们正在将现有的Web表单站点移动到ASP.Net MVC.我们有很多传统页面需要重定向到新控制器.我看到这篇看起来很有趣的文章:http: //blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx
所以我想我可以编写自己的路由处理程序,或者在控制器中进行重定向.后者略微闻起来.
但是,我不太确定如何处理遗留URL中的查询字符串值,理想情况下我需要传递给我的控制器的Show()方法.例如:
旧版网址:
/Artists/ViewArtist.aspx?Id=4589
我想要这个映射到:
ArtistsController显示动作
实际上我的Show动作采用了艺术家的名字,所以我确实希望将用户从Legacy URL重定向到/ artists/Madonna
谢谢!
考虑一种扩展方法,其目的是:
<a>标签
问题:在扩展方法中,如何利用路由值等适当的路由逻辑,而不是对字符串进行硬编码.我怀疑HtmlHelper.GenerateRouteLink是解决方案的一部分,但请建议实现这一目标的最佳方法.
public static string CreateUserLink(this HtmlHelper html, string userAcctName)
{
if (string.IsNullOrEmpty(userAcctName))
return "--Blank--";
//some lookup to A.D.
DomainUser user = ADLookup.GetUserByAcctName(userAcctName);
if (user == null)
return userAcctName;
//would like to do this correctly!
return string.Format("<a href='/MyAppName/User/View/{0}' title='{2}'>{1}</a>"
, user.Mnemonic, user.DisplayName, user.Location);
//normally returns http://mysite.net/MyAppName/User/View/FOO
}
Run Code Online (Sandbox Code Playgroud)
更多信息:

我想做以下事情:
当url没有instID时,我想重定向到该"Instelling"动作
在这个控制器中,每个方法都需要instID.
[RequiredParameter(parameterName="instID", controllerToSend="Instelling")]
public ActionResult Index(int? instID) {
//if (!instID.HasValue) {
// return RedirectToAction("Index", "Instelling");
//}
var facts = _db.Instellingens.First(q => q.Inst_ID == instID).FacturatieGegevens;
return View(facts);
}
Run Code Online (Sandbox Code Playgroud)
所以这是在控制器中.
actionfilter:
namespace MVC2_NASTEST.Controllers {
public class RequiredParameterAttribute : ActionFilterAttribute {
public string parameterName { get; set; }
public string actionToSend { get; set; }
public string controllerToSend { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext) {
if (parameterName != string.Empty) {
if (filterContext.ActionParameters.ContainsKey(parameterName) && filterContext.ActionParameters[parameterName] …Run Code Online (Sandbox Code Playgroud) 我的MVC 3应用程序Auth和Users中有几个区域.我正在使用Phil Haacks Route Debugging工具查看我的路线列表,并根据我的网址查看哪一个被选中.
但是,有一些路由存在,我没有在我的AreaRegistration文件或Globalasax中创建,我不知道它们来自何处或如何摆脱它们.路线在下面以黄色突出显示.
您还可以看到我在Auth区域中创建了一个默认路由(以绿色突出显示),它只是指向我的Auth控制器的Login操作.我调试了RouteTable,它在AreaRegistration.RegisterAllAreas()时被添加; 方法被调用.但是,它也没有被添加到AreaRegistration中,因为它也已经逐步完成了.
ASP.NET MVC是否将此作为默认值添加,如果是这样,我可以以某种方式删除它吗?

在尝试为以下问题找到解决方案时:
大多数情况下,我遇到了"发现多个动作"的问题.如果路由机制发现多个与路由匹配的操作,则会抛出异常500.
例如,ValuesController中有两个操作:
[HttpGet]
public IEnumerable<String> Active()
{
var result = new List<string> { "active1", "active2" };
return result;
}
public IEnumerable<string> Get()
{
return new[] { "value1", "value2" };
}
Run Code Online (Sandbox Code Playgroud)
与默认路由匹配:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
同
GET: /api/values
Run Code Online (Sandbox Code Playgroud)
将发现错误多个动作被发现.
我的问题:如何通过选择指定的操作来绕过异常"找到多个动作"(选择第一个匹配的动作也没关系).
更新1:从tugberk的评论更新,感谢指出.
更新2: Mike的评论更新,似乎问题不正确,所以我通过不提及路由约束来改变问题的方式.
谢谢
rest asp.net-mvc asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api
我有这个网址在我的VS网络服务器上运行得非常好
http://localhost:4454/cms/account/edituser/email@domain.com (works)
Run Code Online (Sandbox Code Playgroud)
但是当我将这个站点发布到IIS7.5时,它只会抛出404.
http://dev.test.com/cms/account/edituser/email@domian.com (does not work)
Run Code Online (Sandbox Code Playgroud)
但如果删除电子邮件地址,就会发生奇怪的事情
http://dev.test.com/cms/account/edituser/email (works , no 404)
Run Code Online (Sandbox Code Playgroud)
但如果我用查询字符串更改我的网址,它可以正常工作
http://dev.test.com/cms/account/edituser?id=email@domain.com (works)
Run Code Online (Sandbox Code Playgroud)
这是我的路线入口
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new[] { "App.NameSpace.Web.Controllers" }
);
Run Code Online (Sandbox Code Playgroud)
我注意到的奇怪的事情是当服务器抛出404错误页面时,它是标准iis 404页面而不是我自己的一个自定义页面.
所以我想知道我的路由映射有什么问题,或者IIS不喜欢有电子邮件作为参数的网址.但是我的当地开发人员一切正常.
谢谢
我已经在互联网上搜索了高低,并检查了所有以前回答过的问题并且标题相同,我无法想出这个问题.
我从我的身份验证控制器中的action方法返回RedirectToAction("Index","Home"),然后收到以下异常:
Server Error in '/' Application.
The controller for path '/Home' was not found or does not implement IController.
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 code.
Exception Details: System.Web.HttpException: The controller for path '/Home' was not found or does not implement IController.
Source Error:
An unhandled exception was generated during the execution of …Run Code Online (Sandbox Code Playgroud) 这可能是一个简单的问题,但我无法让它发挥作用.
我在RouteConfig中指定了这条路线
routes.MapRoute(
name: "DefaultSiteRoute",
url: "{accountid}/{hostname}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, accountid = UrlParameter.Optional, hostname = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
它适用于这样的网址
/123456/www.test.com/
或这个
/123456/www.test.com/Controller/Action
但它无法应付这一点
/123456/www.test.com
我得到了一个IIS 404
更奇怪的是,如果我Url.Action使用默认的Controller和Action(即Home/Index)调用该路由,它会创建一个没有尾部斜杠的URL,然后它无法识别.我真的需要它使用和不使用尾部斜杠.
我有一些方法,我想遵循其URL的特定模式.
基本上有餐馆,有ID,还有一些终端.
我正试图让以下几种模式出现:api/Restaurant - 获取所有餐厅api /餐厅/ Bobs - 获取带有Bobs api /餐厅/ Bobs /终端ID的餐厅 - 获取bobs restaurant api的所有终端/餐厅/凸台/终端/秒 - 在餐厅鲍勃获得ID为秒的终端
我已经有了这样做的方法,并且我已经为每个分配了Route属性,如下所示:
[HttpGet]
public IEnumerable<IRestaurant> Get()
{
//do stuff, return all
}
[HttpGet]
[Route("api/Restaurant/{restuarantName}")]
public IRestaurant Get(string restaurantName)
{
//do stuff
}
[HttpGet]
[Route("api/restuarant/{restaurantName}/terminals")]
public IEnumerable<IMiseTerminalDevice> GetDevices(string restaurantName)
{
//do stuff
}
[HttpGet]
[Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]
public IMiseTerminalDevice GetDeviceByName(string restaurantName, string terminalName)
{
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
但是只有我的基本GET(api /餐厅)才有效.我的WebAPI配置是默认配置,并且读取
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); …Run Code Online (Sandbox Code Playgroud)