【发布时间】:2011-02-03 21:06:39
【问题描述】:
哪种是创建自定义表单控件(如自定义下拉菜单)的正确 MVC 方式? 我需要一种方法来创建这样的控件并在几页中重新使用它。我想使用默认活页夹 在调用 action 方法时绑定选定的值。 有人可以举一个简单的例子吗?
这是我目前的解决方案,我认为它的设计不是很好。
DropDownViewModel.cs
class DropDownViewModel {
...
public string BindName {get; set;} // the name that default binder uses to bind to action param
public int SelectedValue {get;set;} // this value should be set when user use the drop down
...
}
DropDown.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DropDownViewModel>" %>
...
<%= Html.TextBox(Model.BindName) %>
...
当我尝试将此 DropDownViewModel 包含到其他视图模型中时,问题就出现了:
GeneralUserInfoViewModel.cs
class GeneralUserInfoViewModel {
...
public DropDownViewModel Gender {get;set;}
...
}
AccountController.cs
...
public ActionResult EditGeneralUserInfo(GeneralUserInfoViewModel info) {
}
...
要正常工作,BindName 应该设置为“Gender.SelectedValue”。这可以通过在 RegisterUserViewModel 中设置 BindName 来解决。但是,如果 GeneralUserInfoViewModel 是另一个视图模型的一部分,例如:
RegisterUserViewModel.cs
class RegisterUserViewModel {
...
public GeneralUserInfoViewModel GeneralInfo {get;set;}
...
}
现在应该将 BindName 设置为“GeneralInfo.Gender.SelectedValue”,以便与默认活页夹正常工作:
...
public ActionResult RegisterUser(RegisterUserViewModel info) { ... }
...
等等。 如何处理这种分层?如何确定在 DropDownVoewModel 中应将什么设置为 BindName attr?还是有其他更好的实现方式?
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-2