在动作方法中检测空对象

时间:2013-09-24 10:34:43

标签: c# asp.net-mvc

如果我有以下模型和行动:

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();
    }
}

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

2 个答案:

答案 0 :(得分:1)

设置默认值是否有效?

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

        return View();
    }
 }

认为这会起作用,但现在无法测试。

修改

如果您真的没有传递任何内容,似乎奇怪它不起作用,但如果您正在寻找可能更优雅的方法来检查默认值,您可以在Filter上创建一个名为Empty的公共静态只读字段然后你的支票代码可以像

一样可读
if (filters == Filters.Empty)
{ 
    //passed in with nothing
}

string.Empty相似。

答案 1 :(得分:0)

我建议你添加一个特殊的隐藏输入,你可以测试它是否有数据。它可以是bool,始终设置为true。如果结果是false,则不会发布您的任何形式。

或使用Request.HttpMethod查看这是POST还是GET/HEAD