2013-09-24 35 views
0

如果我有以下的型号和行动:检测的操作方法空对象

public class Filters 
{ 
    public string Keyword {get;set;} 
    public int ArticleId {get;set;} 
} 

public class MyController : Controller 
{ 
    public ActionResult Full(Filters filters) 
    { 
     ... 

     return View(); 
    } 
} 

如果路线Full动作没有查询字符串或表单变量在filters填充值,你只是得到一个new Filters()

我需要产生一种情况,我知道这是什么情况,或者查询字符串/表单变量是否有助于填充filters

我以为我可以使用多态,如:

public class MyController : Controller 
{ 
    public ActionResult Full() 
    { 
     var filters = <Perhaps read out of session state> 

     return Full(filters); 
    } 

    public ActionResult Full(Filters filters) 
    { 
     ... 

     return View(); 
    } 
} 

但这不起作用(暧昧)。我写了一个扩展方法给对象,它只是检查所有公共属性是否为默认值,但感觉应该有更好的方法。

+0

正如我所说,现在已经实现了。它确实有效。 –

+0

是的 - 我只是读了那部分:)。但我不认为这是一个问题,因为实质上说这个对象是“空的”,或者它的“等价物”。 –

回答

1

设置默认值是否工作?

public class MyController : Controller 
{ 
    public ActionResult Full(Filters filters = null) 
    { 
     if (filters == null) 
     { 
      //nothing passed in 
     } 
     else 
     { 
      //do some work 
     } 

     return View(); 
    } 
} 

认为这可行,但目前无法测试。

编辑

似乎很奇怪,如果你真的没有传递任何它不工作,但如果你正在寻找可能更优雅的方式来检查的默认值,你可以创建一个在过滤公共静态只读字段名为空,那么你的检查代码也能像

if (filters == Filters.Empty) 
{ 
    //passed in with nothing 
} 

string.Empty类似可读性很强。

+0

不,仍然会得到一个默认的“过滤器” –

0

我建议您添加一个特殊的隐藏输入,您可以测试以查看是否有数据。它可能是始终设置为truebool。如果结果是false,则不会发布您的任何表单。

或使用Request.HttpMethod找出这是否是POSTGET/HEAD