gpt4 book ai didi

asp.net-mvc - 带有接口(interface)的 ASP.NET MVC UpdateModel

转载 作者:行者123 更新时间:2023-12-04 15:49:21 26 4
gpt4 key购买 nike

我试图让 UpdateModel 填充在编译时仅设置为接口(interface)的模型。例如,我有:

// View Model
public class AccountViewModel {
public string Email { get; set; }
public IProfile Profile { get; set; }
}

// Interface
public interface IProfile {
// Empty
}

// Actual profile instance used
public class StandardProfile : IProfile {
public string FavoriteFood { get; set; }
public string FavoriteMusic { get; set; }
}

// Controller action
public ActionResult AddAccount(AccountViewModel viewModel) {
// viewModel is populated already
UpdateModel(viewModel.Profile, "Profile"); // This isn't working.
}

// Form
<form ... >
<input name='Email' />
<input name='Profile.FavoriteFood' />
<input name='Profile.FavoriteMusic' />
<button type='submit'></button>
</form>

另请注意,我有一个继承自 DefaultModelBinder 的自定义模型绑定(bind)器,该绑定(bind)器使用覆盖的 CreateModel 方法中的 StandardProfile 实例填充 IProfile。

问题是FavoriteFood 和FavoriteMusic 永远不会被填充。有任何想法吗?理想情况下,这一切都将在模型绑定(bind)器中完成,但我不确定如果不编写完全自定义的实现是否可行。

谢谢,布赖恩

最佳答案

我必须检查 ASP.NET MVC 代码(DefaultModelBinder),但我猜它反射(reflect)的是 IProfile 类型,而不是实例 StandardProfile。

所以它会寻找它可以尝试绑定(bind)的任何 IProfile 成员,但它是一个空接口(interface),所以它认为自己已完成。

您可以尝试更新 BindingContext 并将 ModelType 更改为 StandardProfile 然后调用

bindingContext.ModelType = typeof(StandardProfile);
IProfile profile = base.BindModel(controllerContext, bindingContext);

不管怎样,有一个空的接口(interface)很奇怪~

编辑:只想添加上面的代码只是伪代码,您需要检查 DefaultModelBinder 以确切了解您要编写的内容。

编辑#2:

你可以做:
public class ProfileModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
{
bindingContext.ModelType = typeof(StandardProfile);
return base.BindModel(controllerContext, bindingContext);
}
}

无需为 AccountView 制作模型绑定(bind)器,它可以正常工作。

编辑#3

测试了一下,上面的 binder 可以,只需要添加:
ModelBinders.Binders[typeof(IProfile)] = new ProfileModelBinder();

您的操作如下所示:
public ActionResult AddAccount(AccountViewModel viewModel) {
// viewModel is fully populated, including profile, don't call UpdateModel
}

您可以在设置模型绑定(bind)器时使用 IOC(例如注入(inject)类型构造函数)。

关于asp.net-mvc - 带有接口(interface)的 ASP.NET MVC UpdateModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1400714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com