2011-10-09 67 views
1

我有一个数据库中的对象,在我的应用程序的很多地方使用。是否有可能使一个非ActionResult方法返回一个ActionResult ...或最佳/最好的解决方法?

实际的精确对象构建起来有点复杂,特别是在开发过程中,我已经多次改变了它。出于这个原因,我从Controller中提取了方法,并构建了一个具有对象返回类型的方法。

但是,这个对象可能不存在,如果没有,我的代码会创建它并返回它。

例如:

public ActionResult Index() 
{  
    var model = GetTheObject(); 
    return View(model); 
} 

public MyComplicatedObject GetTheObject() 
{ 
    MyComplicatedObject passback = ...database query.... 

    if(passback==null) 
    create the object here.... 

    return passback; 
} 

不过,我不再想创建一个默认的对象。如果它不存在,我希望用户被发送到一个视图来创建一个新的。

我不知道是不是因为我在接近凌晨4点的时候编码,或者如果我不是那么好,但是这样做的一个简单方法就是逃避我。

我知道下面将无法正常工作,但理想的,这是我想要的东西:

public MyComplicatedObject GetTheObject() 
{ 
    MyComplicatedObject passback = ...database query.... 

    if(passback==null) 
    return View("CreateObject"); 

    return passback; 
} 

很明显,虽然,这是不行的。

我能想到的最佳解决方案是基本上返回null或异常,然后在ActionResult上有if(passback==null) & return View("CreateObject");(如果为null)。

但是,正如我想在几个地方重复这一点,更有意义的是能够在一行中调用GetTheObject()而不是其他任何行。

有什么办法可以达到这个目的吗?

+1

+1:深夜编码总是当我得到最多的工作要做,但不一定是,当我得到的最思维来完成。 。 。 – surfasb

回答

2

只需从您的方法返回null,并让您的操作方法返回创建视图时,它会得到一个null。

+1

我认为这是迄今为止最简单的解决方案以及我要做的事情。我只需要在大约11个地方做到这一点,而宁可用一种方法来完成这一切!无论如何,我会把这个打开,以便有人知道如何去做,否则,我会在后面标记这个答案。谢谢+1 – Wil

3

我有一个类似的场景,我想返回一个“NotFound”视图,以防我的存储库返回一个空对象。我实现了一个ViewForModel辅助方法来避免重复自己:

public ActionResult Details(int id) 
{ 
    var model = _repository.Retrieve(id); 

    return ViewForModel("Details", model); 
} 

public ActionResult Edit(int id) 
{ 
    var model = _repository.Retrieve(id); 

    return ViewForModel("Edit", model); 
} 

private ActionResult ViewForModel(string viewName, object model) 
{ 
    return model == null 
     ? View("NotFound") 
     : View(viewName); 
} 
+0

+1 Cool! ...将留出一段时间,看看是否有其他人有办法做到这一点。 – Wil

相关问题