[英]How to run asynchronous methods inside my ActionResult in MVC, c#
[英]MVC ActionResult Methods, how are parameters matched?
我会尽力尽力说出来。 让我们假设我在控制器X中有一个方法:
Index(string someString)
这有效吗? :X /索引
或者我需要:X / Index / someString
(所有这些都使用默认路由配置)。
现在,是否可以使用第二种方法,以便:
Index(stringSomestring)
{
..
}
Index()
{
}
如果是这样,MVC路线如何选择正确的方法?
最后...
有什么区别:在routeConfiguration或方法Parameters本身中声明参数默认值?
例如:
rotes.Add("", "etcetc", new {someString = string.Empty);
VS
Index(string someString = string.Empty)
如果它太愚蠢或冗长,谢谢和抱歉。
----编辑-----感谢您对anaximander的回应,你帮我清醒了一下(虽然还在挣扎)。 考虑一下:
routes.MapRoute("",
"Student/Sort-By{sortType}",
new { controller="Student", action="Index", sortType= ""}
);
我有一个方法:
Index(string sortType)
{
...
}
如果我提供了一个网址:学生/排序日期,它可以正常工作。 如果我提供了一个url:Student / Sort-By它什么也没找到,虽然我的方法有一个空排序选项...
我觉得我过于复杂/做一些愚蠢的事情,但无法确定什么:(
这取决于您的路由设置。 默认路由如下所示:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
请注意UrlParameter.Optional
部分。 这意味着你可以去somehost.com/X/Index
,它会寻找一个方法Index()
,或者你可以添加另一个斜杠和一个参数,它会寻找Index(foo id)
,其中foo
是任何类型你喜欢。
路径按您添加的顺序应用。 这意味着如果你从RouteConfig
的顶部开始RouteConfig
读,那么第一个与URL匹配的就是它将使用的那个。 这就是为什么你应该将更多特定路由放在更一般的路由之上 - 否则,一般路由将捕获所有URL并停止使用更具体的路由。
该系统寻找:
{controller}
部分匹配的{controller}
(如果URL未指定,则为默认控制器) {action}
部分匹配的所有操作方法(如果URL未指定,则为默认操作) Index(int id)
,如果URL包含{id}
部分,它将使用该方法。 如果该部分不存在,但路由指定了默认值,那么它将使用该方法的默认值。 如果没有值,没有默认值,并且参数被标记为UrlParameter.Optional
,它将查找不需要id
另一个方法。 (如果参数是必需的,则此路由不匹配,因为URL未提供。) 因此,在您的情况下,如果您希望能够使用somehost.com/X/Index
来获取Index(string someString)
那么您将需要这样的路由:
routes.MapRoute(
name: "Index",
url: "{controller}/{action}/{someString}",
defaults: new { controller = "X", action = "Index", someString = String.Empty }
);
如果URL没有给出一个,那么将使用空字符串调用Index(string someString)
。 如果您希望没有someString
参数的URL转到Index
,那么您可以设置somestring = UrlParameter.Optional
,如果URL没有提供,则会查找不需要它的方法。 如果你将someString
完全保留在默认值之外,那么任何没有提供的URL都将对此路由无效,并且必须匹配其他路由。 如果你仍然在底部有预先提供的默认路由,那么它将捕获somehost.com/X/Index
因为它适合该模板,所以它假设你已经省略了可选的id
参数并寻找一个像Index()
这样的方法。
编辑:
当组合URL fluff和这样的参数时,它会变得有点棘手。 我无法自己运行调试,我猜想就系统而言,当匹配Sort-By{sortType}
,字符串Sort-By
不是"Sort-By" + ""
,它是"Sort-By" + null
。 也就是说,URL不会将{sortType}
的值赋予空字符串,因为空字符串仍然是一个字符串 ,而此URL在该位置根本不包含任何字符串 。 如果URL未提供{sortType}
的值且未标记为可选,则URL与此路由不匹配。 这可能会更好:
routes.MapRoute("",
"Student/Sort/{sortType}",
new { controller="Student", action="Index", sortType= ""}
);
或者,您可以考虑从URL中删除排序并使用查询参数,以便路由成为
routes.MapRoute("",
"Student/",
new { controller="Student", action="Index", sortBy= ""}
);
并排序你去host.com/Student/?sortBy=Date
。
您的路由不能有多个Index()
如果要使用X / Index或X / Index / someText
你必须声明ActionResult索引(字符串someString)
路由过程将知道Index可以接受String,然后它将重定向到正确的操作。 您不需要将字符串呈现为可空或指定空字符串。 字符串将只是null。
为了“猜测”正确的行为,我认为mvc框架使用反射并关联参数的类型和名称。
路由过程将始终有效,但如果要指定与默认方式不同的路由,则必须:
rotes.Add("", "etcetc", new {someString = string.Empty);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.