asp.net mvc和duplication

时间:2011-07-18 01:51:34

标签: asp.net-mvc

我发现asp.net mvc框架正在引导我进行相当多的重复。也许我只是不知道正确的做事方式,所以我会列出一些方面,也许有人可以提出正确的方法:

不接受通用参数的控制器方法。我有多个课程,例如:

class A
class B : A
class C : A
class D : A

和控制器方法:

EditB(B obj)
EditC(C obj)
EditD(D obj)

所有控制器完全相同,但我假设1.我不能有一个通用的控制器参数,2。如果我这样做,模型绑定器只会绑定到A类:

EditA(A obj)

我遇到的下一个问题是局部问题。为了使模型绑定易于工作,我使用如下方法:

Html.TextboxFor(m => m.blah.blahID)

但是当在只有m.blah的多个视图之间共享partial时,我会这样做:

RenderPartial("BlahPartial", m.blah);

问题是现在我假设使用

Html.TextboxFor(m => m.blahID) 

在局部内部不会给我我想要的东西,因为它错过了等等。

最后,在控制器方法中,我发现很难将常见算法提取为invidiual方法:

if (a)

return ActionResult("Blah");

else 

return ActionResult("Home");

(or RedirectToAction or return View("Home") etc.)

似乎难以放入私有方法,因为我无法将这些内容返回到原始控制器之外的其他任何内容。

1 个答案:

答案 0 :(得分:2)

我不确定我是否可以让你走上正轨,因为你的问题非常通用,但我认为你可能必须为每个模型分别设置控制器动作。这并不意味着您无法共享代码。一种方法是使用每个特定控制器从中派生的公共基本控制器。所有控制器/模型共有的代码可以重构为基本控制器。

就部分而言,您可以通过ViewData提供前缀 - 请参阅http://davybrion.com/blog/2011/01/prefixing-input-elements-of-partial-views-with-asp-net-mvc/

我不确定为什么你认为你不能轻易拥有私人方法。拥有一个返回特定模型或按名称使用特定视图的私有方法并不困难。

private ActionResult RedirectOnSuccess<T>( T model, string action ) where T : IBaseModel
{
    if (model.IsValid())
    {
        // save to database, etc.
        return RedirectToAction( action );
    }
    return View( model ); // will re-render the view corresponding to the called action
}

然后将其称为

public ActionResult Edit( SpecificModel model )
{
   return RedirectOnSuccess( model, "index" );
}