ASP.NET MVC 需要 DRY 类似的控制器操作

ASP.NET MVC need to DRY similar controller actions

在 ASP.NET MVC 中,我有 2 个 "Login" 动作几乎做同样的事情,但它们使用不同的模型和 return 不同的视图。我如何确保这些操作遵循 DRY 规则?

我尝试制作一个单独的函数来接收我需要的参数,但我无法通过不同的模型来做到这一点。

下面是两个动作:

Public Function Login(model As AccountViewModels.InternalLoginViewModel, location As String) As ActionResult
  ...

  If ... Then
     ...
     Return View(model)
  End If

  If Not ModelState.IsValid Then
     Return View(model)
  End If
  ...
  If authenticationResult.Success Then
     ...
  ElseIf ... Then
     Dim appUser As ApplicationUser = authService.GetApplicationUser(model.EmailUsername)
    ...
  ElseIf .. Then
     Return RedirectToAction("OldAppnuserRegister", MVC_CONTROLLER_ACCOUNT, authenticationResult.OldUser.GetRouteValues(location))
  ElseIf ... Then
     Return RedirectToAction("Index", MVC_CONTROLLER_MANAGE, New With {.userKey = authService.GetApplicationUser(model.EmailUsername).Key.ToString})
  End If
  ...
  Return View(model)
End Function

---------------

Public Function RepLogin(model As RepSessionViewModels.InternalLoginViewModel, location As String) As ActionResult
  ...

  If ... Then
     ...
     Return View("~/Views/RepSession/SelectProvider.vbhtml", model)
  End If

  If Not ModelState.IsValid Then
     Return View("~/Views/RepSession/SelectProvider.vbhtml", model)
  End If
  ...
  If authenticationResult.Success Then
     ...
  ElseIf ... Then
     Dim appUser As ApplicationUser = authService.GetApplicationUser(model.Email)
    ...
  ElseIf ... Then
     Return RedirectToAction("OldRepRegister", MVC_CONTROLLER_ACCOUNT, authenticationResult.OldUser.GetRouteValues(location))
  ElseIf ... Then
     Return RedirectToAction("Index", MVC_CONTROLLER_MANAGE, New With {.userKey = authService.GetApplicationUser(model.Email).Key.ToString})
  End If
  ...
  Return View("~/Views/RepSession/SelectProvider.vbhtml", model)
End Function

我用“...”替换了重复的代码以使其更具可读性。感谢所有帮助。谢谢。

根据 posted 代码,不清楚您需要什么。

但是假设你真的需要两个不同的模型,你有不同的方法来做,请参考这个posthttp://www.dotnet-stuff.com/tutorials/aspnet-mvc/way-to-use-multiple-models-in-a-view-in-asp-net-mvc。 如果您仍有疑问,请正确澄清 views/models.

之间的 differences/similarities

以我个人的经验,这种情况只是一个糟糕的设计,你总是可以有一个基础模型、基础视图和部分视图来正确地完成它,以避免重复代码。

我得到的答案指向一个设计问题,我假设它是并且没有其他方法可以解决我的问题。

我最后做的是使 Model/Action/View 相同并完全删除 RepLogin。将用户要求从仅接受 RepLogin 中的电子邮件更改为还接受用户名。如果我们处于 RepLogin 或正常登录状态,则根据布尔语句确定魔术字符串。

不是完美的解决方案,因为我不得不更改我原本不想更改的内容,但它确实有效。