【问题标题】:How to create an MVC UserControl如何创建 MVC 用户控件
【发布时间】:2011-06-23 10:55:58
【问题描述】:

我正在尝试在 ASP.NET MVC 项目中创建用户控件。我基本上有一些我想放在中继器中的格式化数据。在标准的 ASP.NET 中,我会像这样填充控件:

 <asp:Repeater ID="MyRepeater" runat="server" 
               DataSourceID="SQLDataSource" DataMember="DefaultView">
     <ItemTemplate>                             
          <uc1:Control ID = "MyControl" runat="server" 
                       Field1='<%#Eval("[\"Field1\"]") %>' Field2='<%#Eval("[\"Field2\"]") %>' />                            
     </ItemTemplate>
 </asp:Repeater>

并且该控件将在代码文件中具有相应的属性。但是,在 MVC 中,我没有标准的代码文件。我发现this 问题描述了如何添加一个,但后来想知道在 MVC 中是否有更好的方法来做到这一点(我找不到任何说推荐方法的像样的文章)。

【问题讨论】:

  • 这回答了你的问题吗?

标签: asp.net-mvc user-controls repeater


【解决方案1】:

您不需要代码隐藏文件。为您的 PartialView (ViewUserControl) 创建一个模型并将其绑定到您的控件。

MVC 的重点是让控件远离 View,这应该是愚蠢的......或者至少不聪明。您的 Controller 应该将一个对象推送到包含一个 Model 对象,该对象已经拥有 View 所需的一切。

声明你的模型

public class MyModel
{
    public IList<MyPartialView> Controls { get; set; }
}

public class MyPartialView
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

在控制器中创建您的操作传递一个MyModel 对象

public ActionResult Index()
{
    MyModel model = new MyModel();
    model.Controls.Add(new MyPartialView() { Field1 = "a", Field2 = "b" };
    model.Controls.Add(new MyPartialView() { Field1 = "x", Field2 = "y" };
    model.Controls.Add(new MyPartialView() { Field1 = "m", Field2 = "n" };

    return View(model);
}

创建您的视图强类型为MyModel

<%@ Page Language="C#" Inherits="ViewPage<MyModel>" %>

<% foreach(MyOtherPartialView partial in Model.Controls) { %>
<%=Html.RenderPartial("MyPartialView", partial) %>
<% } %>

创建您的局部视图仅输入MyPartialView

<%@ Control Language="C#" Inherits="ViewUserControl<MyPartialView>" %>

<div>
    <%=Model.Field1 %> - <%=Model.Field2 %>
</div>

【讨论】:

  • 你是说数据访问应该在Controller里面?我的印象是这应该在模型中。
  • 控制器应该将数据推送到模型并从模型中提取数据。模型应该是愚蠢的。如果您正在进行 n 层开发,您的控制器不应直接处理数据访问。控制器可以与业务层对话,业务层向数据访问层发出请求,数据访问层返回原始数据,业务层将其转换为控制器可用的对象。
猜你喜欢
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多