我的动作控制器代码看起来很业余

时间:2009-05-19 19:24:00

标签: asp.net-mvc actioncontroller

首发时间,

我一直在玩MVC abit ...我有一个视图,它有多个输入字段,其中一些字段在发布时可能是空白的。

该帖子的控制器内部的动作方法看起来像这样

public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember)

我一直在使用DynamicQuery扩展,为了在我的数据库上执行动态Linq查询,我已经将其封装在一个Search对象中,该对象被传递到数据访问层以进行执行。

但是,我还有一个自定义的ViewData对象,它被传递回视图以显示输入值和查询结果。

在代码中看起来有点讨厌,因为我必须同时设置搜索对象属性和ViewDatas。

public ActionResult Filter(int? id, string firstName, string lastName, bool? isMember)  { 
var search = new Search { 
Id = id, 
FirstName = firstName, 
LastName = lastName, 
Member =  isMember 
}; 

var memberViewData = new MemberViewData { 
Id = id, 
FirstName = firstName, 
LastName = lastName, 
Member =  isMember
}; 

memberViewData.Results = _dataRepository.GetMember(search); 

return View("Search", memberViewData); 

}

我是否过度思考这个问题并且真的应该将值传递给数据访问层并在控制器中填充ViewData,或者我可以使用更优雅的模式或实践?

很抱歉,如果这看起来很糟糕,那么就没有人可以反省意见和时间深入挖掘框架。

3 个答案:

答案 0 :(得分:2)

使用modelbinder绑定数据

答案 1 :(得分:1)

根据您的代码段,除了Search类的属性外,MemberViewData类还具有Results属性。因此,第一步是使MemberViewData从Search派生,并定义一个接受Search实例作为参数的构造函数,并从中分配它的基本属性。接下来我会像这样改变动作方法:

public ActionResult Filter(Search search)  
{ 
    return View("Search", new MemberViewData(search) 
    {
        Results = _dataRepository.GetMember(search)
    }); 
}

答案 2 :(得分:0)

与Tadeusz提到的一样,ModelBinder可以帮助您构建MemberViewData,这样只会获取结果。

您还可以决定创建一个演示服务,该服务了解如何构建此视图数据对象并简单地委托给它。我更喜欢这里的模型粘合剂方法。