我有接口IInterface和实现它的类Concrete。
我有个视野
@model IEnumerable<IInterface>
@for (int i = 0; i < Model.Count(); i++)
{
@Html.EditorFor(x => x[i])
}
<span id="result"></span>编辑器模板Concrete.cshtml
@model Concrete
@Ajax.BeginForm("Action", new AjaxOptions { UpdateTargetId = "result" })
{
@Html.Hidden("ModelType", Model.GetType())
<input type="submit" />
}采取行动:
public string Action(IInterface interface) { return "success"; }和一份样板活页夹:
public class MyModelBinder : DefaultModelBinder
{
protected override CreateModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext,
Type modelType)
{
var typeValue = bindingContext.ValueProvider.GetValue(
bindingContext.ModelName + ".ModelType"
);
...我以前在IInterface中使用过这种方法,但是,当我提交Ajax表单时,bindingContext.ModelName是空的。
在调试器中检查ValueProvider,我可以看到它包含一个FormValueProvider,其中的_values包含键[0].Interface.ModelType。
使用即时窗口,我可以确认调用.GetValue("[0].Interface.ModelType")返回适当的typeValue。
如何使bindingContext.ModelName不为空,或者如何获得所需的字符串"[0].Interface.ModelType"?
发布于 2014-03-04 17:38:15
好吧,我找到了一个令人讨厌的解决方案,这绝不是令人满意的:
var typeValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".ModelType");
if (typeValue == null)
{
var enumerable = (IEnumerable)bindingContext.ValueProvider;
var formValueProvider = enumerable.OfType<FormValueProvider>().Single();
var field = typeof(NameValueCollectionValueProvider).GetField(
"_values",
BindingFlags.NonPublic | BindingFlags.Instance
);
var dictionary = (IDictionary)field.GetValue(formValueProvider);
var keys = (IEnumerable<string>)dictionary.Keys;
var key = keys.FirstOrDefault(x => x.EndsWith(".ModelType"));
typeValue = bindingContext.ValueProvider.GetValue(key);
}https://stackoverflow.com/questions/22177646
复制相似问题