【问题标题】:Placement of a Function in an ASP.NET MVC Application在 ASP.NET MVC 应用程序中放置函数
【发布时间】:2012-09-06 01:39:35
【问题描述】:

出于教育目的,我正在构建一个克隆社交书签服务(类似于 reddit)。在列表中的每个“书签”下,我想显示源 URL 的 基本域(而不是完整的 URL。

我已经在 SO 上找到了一些关于如何执行此操作的线程,因此我继续创建了一个类来抽象功能,但我不确定我应该在哪里实际调用该方法。

目前我有我的BookmarkList 控制器方法将Bookmark 对象列表传递给视图,我在视图中迭代列表。由于 Bookmark 对象没有用于存储基本 URL 的属性(因为我正在动态计算它)我不能在将它们传递给视图之前将其放在 Bookmark 对象中(看起来反正错了)。那么我应该调用从视图本身创建的 GetDomainFromUrl 方法吗?出于某种原因,这也不合适。

我不确定如何在不违反 MVC 约定的情况下适应此功能。

谢谢。

【问题讨论】:

  • 当您说“Bookmark 对象没有用于存储基本 URL 的属性(因为我正在计算它)”时,计算此基本 URL 需要什么信息苍蝇”?您是否有无法将属性添加到 BaseURL 的 Bookmark 模型的原因?
  • @kaveman 我没有理由不能,我只是被教导——作为一般规则——存储任何可以在运行时计算的东西并不是最好的主意(除非它影响表现过度)。不确定这是否是 SO 的一般意见,正如我被告知的那样。

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


【解决方案1】:

我会将它添加到 Bookmark 类中。可以计算属性,这是来自 msdn (MSDN source) 的 asp.net mvc 教程中的示例:

    public string LastName { get; set; }
    public string FirstMidName { get; set; }

    public string FullName
    {
        get
        {
            return LastName + ", " + FirstMidName;
        }
    }

您可以在这里调用 GetDomainFromUrl 方法,而不是简单地连接字符串。

IE,

public string BaseUrl
{
    get
    {
        return GetDomainFromUrl(this.Url);
    }
}

请注意,没有定义 set 方法,因为您可以/将要设置 Url 属性。

另外,您的网址是否存储为字符串?

如果您使用的是URI class,您可以只使用 this.FullUrl.Host,假设您的文章的 url 是在一个名为 FullUrl 的属性中定义的。(还假设这不会破坏此分配的要点,因为您说这是给学校的。)

【讨论】:

  • URL 存储为字符串。任务的目的是构建服务并完成软件开发的所有步骤,不管我怎么做。我会调查的。
  • 酷。我在你提到的问题的 cmets 中注意到你被教导不要存储任何可以在运行时计算的东西。我同意这种说法。你用什么来存储这个?我在这个项目/教程中使用实体框架,我刚刚确认它没有在数据库中为 FullName 属性创建列。
  • @Kye 在 cmets 中提到的内容:@ahartman00 的答案没有存储 BaseURL,因为您会看到它是只读的,并且在调用时会调用一个函数本身。
  • @ahartman00 我确实在使用实体框架。我试试看。
【解决方案2】:

对于非常基本的场景,或者您可以完全控制模型的情况,MVC(模型、视图、控制器)是一个很好的模式。

根据我的经验,您通常需要额外的信息,这些信息对您的视图很重要,但对您的实际模型并不重要。例如,要为模型属性显示的下拉项目列表,或者在您的情况下,放置站点的基本 URL 以供用户查看。

在这种情况下,我喜欢将 MVC 适配为 VM-V-C(ViewModel、View、Controller)。

基本上,您会想要创建一个 Bookmark ViewModel 并在渲染视图时使用它:

BookmarkViewModel.cs:

public class BookmarkViewModel
{
    public string BaseUrl {get;set;}

    // + all existing bookmark properties
}

您可以将基本 URL 函数直接添加到您的视图模型中并让视图模型自己执行该功能,或者您可以在创建视图模型时在控制器中执行此操作。

【讨论】:

  • 有趣的概念,但它的目的可能有点矫枉过正。在一些学生......嗯,很难掌握概念的小组环境中工作,所以这可能是个问题。
  • +1 表示 ViewModel 概念。在这种情况下矫枉过正;我想是的,但这是我发现自己使用的一个概念。 @armen.shimoon 提到的例子很好,此外:为了避免泄露不想让用户或第三方观察者知道的信息。
【解决方案3】:

关于如何做到这一点,有几种不同的选择。我建议将 GetDomainFromUrl() 方法存储在 Bookmark 类中。我还建议为 BaseUrl 创建一个属性。

然后,您可以将完整的 Url 传递给构造函数中的 Bookmark 对象,执行您的函数,并将其设置为 BaseUrl 属性。

class Bookmark
{
    public string BaseUrl { get; }

    public Bookmark(string url)
    {
        BaseUrl = GetDomainFromUrl(url);
    }

    private string GetDomainFromUrl(string url)
    {
        //your logic to generate BaseUrl
    }
}

另一种选择是执行以下操作:

class Bookmark
{
    private string baseUrl;

    public string BaseUrl
    {
        get
        {
            return baseUrl;
        }
        set
        {
            baseUrl = GetDomainFromUrl(value));
        }
    }

    private string GetDomainFromUrl(string url)
    {
        //your logic to generate BaseUrl
    }
}

然后将代码中的 BaseUrl 属性 somplace 设置为完整 url 的值,当您这样做时,它将执行您的功能并将其存储在您的属性中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多