我发现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.)
似乎难以放入私有方法,因为我无法将这些内容返回到原始控制器之外的其他任何内容。
答案 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" );
}