我的页面上需要一个下拉列表,允许用户选择其状态。由于这可能是一个将在别处使用的控件,我认为创建一个可以重用的MVC View用户控件是个好主意。
我认为控件看起来像这样:
<select name="" id="">
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
</select>
我视图中的代码类似于:
<%= Html.RenderPartial("StateDropdownControl") %>
我的问题是,在控件上设置名称和ID的最佳方法是什么?如果需要,我想确保在一个页面上可以有多个此控件实例。此外,我希望能够发送默认情况下应该选择的状态。
我会以某种方式使用ViewData吗?
答案 0 :(得分:9)
Corey正在寻找合适的解决方案。我认为为您的视图声明特定的模型对象会使视图变得非常简单,并且副作用使得它们容易被测试。
因此,您可能不想仅将ID作为对象传递,而是希望创建自己的Model对象以进行传递。
看起来像这样:
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为null / blank(可能会抛出错误)和SelectedState为null / blank之类的内容进行检查。
答案 1 :(得分:3)
您可以将对象数据与用户控件一起传递给RenderPartial方法进行渲染,这样您就可以轻松执行以下操作:
<%= Html.RenderPartial("/someDirectory/SomeControl.ascx", "MyID") %>
and in the UserControl do the following:
<select name="<%=ViewData.Model%>" id="<%=ViewData.Model%>">
....
Just to be sure, a better way to handle it is to make a simple DTO (data transfer object) to hold that information so you can pass more information to your user control, that you will inevitably need.
Example:
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) %>
<%= Html.RenderPartial("/someDirectory/SomeControl.ascx", "MyID") %>
请确保将用户控件的代码设置为此示例的ComboData类型的通用代码。
答案 2 :(得分:1)
看一下Html.DropDownList帮助器方法。它有许多重载,允许您传递列表数据并设置所选项目。最简单的版本只设置选择的名称。
<%= Html.DropDownList("SelectStates"); %>
如果ViewData [“SelectStates”]中有一个MultiSelectList类型的值,那么列表将自动填充。