Zai*_*sud 26 .net c# asp.net-mvc c#-4.0 asp.net-mvc-3
您的行动签名中是否有使用以下两种备选方案的优点/缺点:
public ActionResult Action(int? x) // get MVC to bind null when no parameter is provided
{
if(x.HasValue)
{
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public ActionResult Action(int? x = null) // C# optional parameter (virtual overload)
{
if(x.HasValue)
{
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 29
我在实践中从未见过第二个动作签名,也看不出它的任何用处.
第一个通常涵盖所有场景:
GET /somecontroller/action),则x参数的值在操作中将为nullGET /somecontroller/action?x=abc),则x参数的值在操作中将为null,并且模型状态将无效GET /somecontroller/action?x=123),则将为其分配x.在我的示例中,我使用了带有查询字符串参数的GET请求,但显然同样适用于其他HTTP谓词,如果x是路由参数.
您只需要指定可选参数值,如果它将是除了之外的任何其他值null.
null如果在重载或调用Action中没有指定任何内容,MVC3将自动设置为参数的值.
但是,值得注意的是,如果签名中的此参数之后有任何非可选参数,则null必须在调用中指定.
因此,最好将所有可选参数放在签名的末尾.
为什么不通过删除不必要的代码分支来简化控制器操作方法,并且具有如下所示的这种代码:
public ActionResult Index()
{
// do something when there's no id
}
[RequiresRouteValues("id")]
public ActionResult Index(int id)
{
// do something when id is present
}
Run Code Online (Sandbox Code Playgroud)
这当然是可行的,只要您为RequiresRouteValuesAttributeaction方法选择器提供非常简单的代码即可.您可以在此博客文章中找到完全相同的代码.
我认为这是解决这个问题的最佳方法,因为:
无论如何.关于此技术的所有细节都在链接的帖子中详细解释.
| 归档时间: |
|
| 查看次数: |
37564 次 |
| 最近记录: |