在操作方法中检测空对象

本文关键字:对象 检测 操作方法 | 更新日期: 2023-09-27 18:32:29

如果我有以下模型和操作:

public class Filters
{
    public string Keyword {get;set;}
    public int ArticleId {get;set;}
}
public class MyController : Controller
{
    public ActionResult Full(Filters filters)
    {
        ...
        return View();
    }
}

如果您路由到没有查询字符串或表单变量来填充filters中的值的Full操作,则只需获得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();
    }
}

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

在操作方法中检测空对象

设置默认值有效吗?

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

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

编辑

看起来很奇怪,如果您真的没有传递任何内容,它不起作用,但是如果您正在寻找一种更优雅的方式来检查默认值,您可以在过滤器上创建一个名为 Empty 的公共静态只读字段,然后您的检查代码可能非常可读,例如

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

类似于string.Empty.

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

或者使用Request.HttpMethod来查明这是POST还是GET/HEAD