【问题标题】:ASP.NET MVC View User Control - how to set IDs?ASP.NET MVC 查看用户控件 - 如何设置 ID?
【发布时间】:2008-11-05 15:34:10
【问题描述】:

我的页面上需要一个下拉列表,允许用户选择他们的状态。由于这可能是一个将在其他地方使用的控件,因此我认为创建一个可以重用的 MVC 视图用户控件是一个好主意。

我在想控件看起来像这样:

<select name="" id="">
   <option value="AL">Alabama</option>
   <option value="AK">Alaska</option>
</select>

在我看来,代码是这样的:

<%= Html.RenderPartial("StateDropdownControl") %>

我的问题是,在控件上设置名称和 ID 的最佳方法是什么?如果需要,我想确保我可以在一页上拥有该控件的多个实例。另外,我希望能够以默认选择的状态发送。

我会以某种方式使用 ViewData 吗?

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    Corey 找到了正确的解决方案。我认为为您的视图声明特定的模型对象会使视图变得非常简单,并且作为附带的好处使它们很容易测试。

    因此,您可能希望创建自己的模型对象来传递,而不是仅仅将 ID 作为对象传递。

    它可能看起来像这样:

    public class StateDropDownPresentationModel
    {
        public string DropDownID { get; set; }
        public string SelectedState { get; set; }
    }
    

    显然,请继续向此模型添加您需要的任何内容,以使您的视图正确。

    那么,你可以这样称呼它:

    <%= Html.RenderPartial("/someDirectory/SomeControl.ascx", new StateDropDownPresentationModel { DropDownID = "MyID", SelectedState = "IL" } %>
    

    然后只需确保检查 ID 是否为空/空白(这可能会引发错误)和 SelectedState 是否为空/空白。

    【讨论】:

      【解决方案2】:

      您可以将对象数据传递给 RenderPartial 方法并结合用户控件进行渲染,因此您可以轻松地执行以下操作:

      <%= Html.RenderPartial("/someDirectory/SomeControl.ascx", "MyID") %>
      

      并在 UserControl 中执行以下操作:

      <select name="<%=ViewData.Model%>" id="<%=ViewData.Model%>">
      
      ....
      

      可以肯定的是,处理它的更好方法是创建一个简单的 DTO(数据传输对象)来保存该信息,以便您可以将更多信息传递给您的用户控件,这是您不可避免地需要的。

      例子:

      
      class ComboData 
      {
         string ID {get;set;}
         string CssClass {get;set;}
         //Other stuff here
      }
      
      
      <%
      var comboData = new ComboData {ID = "myID", CssClass = "comboStyle" }
      
      %>
      
      <%= Html.RenderPartial("/someDirectory/SomeControl.ascx", comboData) %>
      

      确保将用户控件的 Code behind 设置为该示例的 ComboData 类型的泛型。

      【讨论】:

        【解决方案3】:

        看看 Html.DropDownList 辅助方法。它有许多重载,允许您传递列表数据并设置所选项目。最简单的版本只是设置选择的名称。

        <%= Html.DropDownList("SelectStates"); %>
        

        如果 ViewData["SelectStates"] 中有一个 MultiSelectList 类型的值,则将自动填充该列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          • 1970-01-01
          • 2014-10-15
          • 1970-01-01
          • 2010-09-06
          • 2010-09-06
          • 1970-01-01
          相关资源
          最近更新 更多