首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回空ModelName的接口自定义模型绑定

返回空ModelName的接口自定义模型绑定
EN

Stack Overflow用户
提问于 2014-03-04 16:35:10
回答 1查看 1K关注 0票数 1

我有接口IInterface和实现它的类Concrete

我有个视野

代码语言:javascript
复制
@model IEnumerable<IInterface>
@for (int i = 0; i < Model.Count(); i++)
{
    @Html.EditorFor(x => x[i])
}
<span id="result"></span>

编辑器模板Concrete.cshtml

代码语言:javascript
复制
@model Concrete
@Ajax.BeginForm("Action", new AjaxOptions { UpdateTargetId = "result" })
{
    @Html.Hidden("ModelType", Model.GetType())
    <input type="submit" />
}

采取行动:

代码语言:javascript
复制
public string Action(IInterface interface) { return "success"; }

和一份样板活页夹:

代码语言:javascript
复制
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"

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-04 17:38:15

好吧,我找到了一个令人讨厌的解决方案,这绝不是令人满意的:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22177646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档