是的,当然,首先您需要确保 SelectedProduct 具有 Id 和 Name 属性,然后您必须让 Model.Products 返回 SelectedProduct 列表并覆盖 SelectedProduct 上的一些方法,如下所示:
public override bool Equals(object obj)
{
var other = obj as ClientLookup;
if (other == null)
return false;
return Id.Equals(other.Id);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
public override string ToString()
{
return Id.ToString();
}
通过覆盖这些方法,尤其是 ToString,您可以确保在内部 DropDownListFor 将您的 Model.Products 中的 SelectedProduct 与 Foo 中的当前 SelectedProduct 匹配。
最后一部分是 ModelBinder,通过这种机制,您将能够将 http 参数转换为要在目标模型中设置的对象,对于 SelectedProduct,您必须这样做:
public class SelectedProductModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
SelectedProduct selectedProduct = new SelectedProduct();
if (value.AttemptedValue != null && ! "".Equals(value.AttemptedValue))
selectedProduct.Id = (int)value.ConvertTo(typeof(int));
else
selectedProduct.Id = null;
return selectedProduct;
}
}
现在不要忘记在应用初始化期间注册 ModelBinder:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ModelBinders.Binders.Add(typeof(SelectedProduct), new SelectedProductModelBinder());
}
}
希望这可以帮助。