代码之家  ›  专栏  ›  技术社区  ›  Erv Walter

是否在ASP.NET MVC中查看特定模型?

  •  8
  • Erv Walter  · 技术社区  · 15 年前

    我对MVC比较陌生,所以这可能是一个新手问题。

    我现在看到两种情况。想象一下一个非常基本的应用程序,它允许用户查看和编辑律师的在线个人资料。有一个用于显示特定用户配置文件的操作/视图和一个用于编辑特定用户配置文件的操作/视图。很容易想象一个漂亮干净的模型类来表示用户配置文件的细节,可能是用实体框架创建的,并映射到用户配置文件SQL表。

    在显示用户配置文件的视图操作/视图中,功能上,我需要一个按钮或链接,允许用户编辑配置文件。但这应该只对部分用户可用。例如,用户可以编辑自己的配置文件。此外,超级用户可以编辑任何人的个人资料。我的问题是,在呈现特定概要文件时,视图应该如何决定链接是否应该存在。我假设视图包含用于确定当前用户是否可以编辑当前概要文件的逻辑是错误的。我应该向UserProfile模型类添加IsEditable属性吗?这并不让人觉得悲惨,但也不完全正确。我是否应该创建一个新的模型类,用附加的安全信息聚合UserProfile?

    我想我试图弄清楚的一般问题是,我是否应该创建大量基本上特定于单个视图的小模型类。每个类将包括该特定视图所需的较大域模型的各种不相关部分。

    4 回复  |  直到 15 年前
        1
  •  3
  •   Bikal Lem    10 年前

    视图模型 模式更具体地针对您所描述的场景。你可以使用 视图数据 但这是不太推荐的解决方案,因为您失去了ASP.NET MVC框架的许多好处。例如,当您使用 视图数据 您的视图中没有类型安全、编译时检查和intellisense支持。

        2
  •  2
  •   tvanfosson    15 年前

    对于您的场景,我将在ViewData中传递另一个参数ViewData[“AllowEdit”],如果视图显示编辑链接,则该参数将设置为true。我更喜欢这样做,而不是将模型克隆到特定于视图的模型中来添加这个单一属性。我有时确实会创建视图特定的模型——例如,我有一个Grid ViewUserControl,它接受一个网格模型,我可以从任何其他模型类列表中生成该模型——但在这种情况下我不会这样做。

    在我看来,我会这样做:

    <% if (Convert.ToBoolean(ViewData["AllowEdit"])) { %>
    <%= Html.ActionLink("Edit", "Edit", "Profile",
                        new { id = ViewData.Model.ID }, null ) %>
    <% } %>
    
        3
  •  1
  •   Misko    15 年前

    对于第一种情况,我可能会尝试在概要文件模型中封装这方面的逻辑,可能会使用一个类似CanEdit()的函数,该函数接受用户信息参数,并检查用户是否是概要文件的所有者,或者他们是否具有超级用户权限。然后在控制器中调用函数,并使用ViewData将结果传递给视图。

        4
  •  0
  •   Jason Plank IEnumerator    13 年前

    您可以为所有视图模型类创建一个基本模型类,并包含在许多视图中都有用的信息,即使不是在所有视图中都有用。

    public class BaseModel
    {
        Guid ActiveUserId;
    }
    
    public class EditModel : BaseModel
    {
        Guid AuthorUserId;
    }
    

    然后,在您看来,您可以进行基本比较:

    <% if (Model.ActiveUserId == AuthorUserId)
        Response.Write (Html.ActionLink (.....)) %>
    

    这个简单的检查是很好的,它并没有太多的逻辑,无论如何,有人应该决定这个链接是否应该出现。当然,你可以创建两种不同的视图,有链接的和没有链接的,但是这太过分了。