4

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

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

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

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

谢谢。

4

3 回答 3

4

我会将它添加到 Bookmark 类中。可以计算属性,这是来自 msdn(MSDN 源)的 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 类,则可以只使用 this.FullUrl.Host,假设您的文章的 url 是在名为 FullUrl 的属性中定义的。(还假设这不会破坏此分配的要点,因为您说这是为了学校。)

于 2012-09-13T01:57:09.217 回答
1

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

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

在这种情况下,我喜欢将 MVC 改编为 VM-VC(ViewModel、View、Controller)。

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

书签视图模型.cs:

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

    // + all existing bookmark properties
}

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

于 2012-09-13T01:54:59.460 回答
0

关于如何做到这一点,有几种不同的选择。我建议将 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 的值,当您这样做时,它将执行您的功能并将其存储在您的属性中。

于 2012-09-13T01:56:14.100 回答