【问题标题】:Pass a parameter or have different action methods传递参数或具有不同的操作方法
【发布时间】:2012-05-22 11:18:15
【问题描述】:

我正在使用 mvc 为不同的集成创建提要 api。例如,假设我想向其他人提供发布在我网站上的问题的提要。最初的实现是将第三方的名称作为参数传递给提要控制器上的操作方法。

public XmlResult Get(string partner)
{

    //Call the business layer and get the List<Questions>       


    if (!string.IsNullOrEmpty(partner))
    {
        partner = partner.ToLower();

        switch (partner)
        {
            case "org1":
                Org1XMLFeedViewModel org1FeedViewModel = new Org1XMLFeedViewModel();
                org1FeedViewModel.LastBuildDate = DateTime.Now;

                foreach (QuestionInfo Question in QuestionsForFeed)
                {
                    Org1XMLFeedQuestionViewModel QuestionForFeed = new Org1XMLFeedQuestionViewModel(Question);
                    Org1FeedViewModel.Questions.Add(QuestionForFeed);
                }
                return new XmlResult(Org1FeedViewModel);                        
        case "org2":
        //similar to org1, use org2 ViewModel                       
            default:
                return new XmlResult(QuestionsForFeed);
        }
    }

    return new XmlResult(QuestionsForFeed);
}

然而,现在有一种想法,也许不同的视图模型不应该在同一个动作方法中。因此,不是将伙伴作为参数传递,而是针对不同的伙伴有不同的操作方法。

哪个更好,为什么?或者您有没有更好的模式?

【问题讨论】:

  • 我不认为你需要在这里采取不同的行动。
  • 你能把伙伴模型绑定成一个对象吗?并使用继承,这样你就可以摆脱 switch 语句?

标签: c# .net asp.net-mvc design-patterns


【解决方案1】:

控制者需要节食;)

OT:就个人而言,我建议您将它们拆分为不同的操作方法,将其分开,以便每个操作只能返回一种类型的控制器,因为它是那种 Action 类型

这样做也意味着您可以从 Controller 中抽象出该逻辑,因为 MVC 的最佳实践是 瘦控制器,胖模型,您将无法坚持因为在这种情况下,必须由您的控制器来确定模型类型。

【讨论】:

  • 将代码拆分成各种动作并不是实现瘦控制器的解决方案,也可以通过为业务逻辑引入一些类并从控制器中调用这些类来完成。
  • 是的,因为他将如何确定要返回的类型?调用返回对象的服务?不好:)
  • +1 伙计,我同意您的评论,如果这对调用者造成混淆,否则返回对象不是坏事。至于调用者知道他会得到什么作为返回类型,最后它是个人喜好。
  • 是的,我想就模型而言,尽管您确实想向视图发送与视图中的模型匹配的 exact 类型(保存转换等),但在其他地方返回虽然我同意,但对象还不错:)
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多