在尝试创建模型绑定器时我做错了什么?

时间:2011-05-25 12:13:53

标签: asp.net-mvc-3

我有这个型号:

public class QuestionSimple
    {
        public string Body { get; set; }
        public bool IsSingleChoice { get; set; }
        public List<String> Answers { get; set; }
        public string Difficutly { get; set; }
        public string Explanation { get; set; }

    }  

我试图在Global.asax.cs

中使用此行绑定
ModelBinders.Binders.Add(typeof(QuestionSimple), new AddQuestionSimpleBinder());  

...使用此活页夹

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            // Get the raw attempted value from the value provider    
            string key = bindingContext.ModelName;
            ValueProviderResult val = bindingContext.ValueProvider.GetValue(key);  
            //val is ALWAYS NULL
            return null;
        }  

但是val也是空的 当我使用我的活页夹时,这是应该返回(实际上确实返回)答案列表的视图。

 @using (Html.BeginForm("AddQuestionSimple", "Topic", FormMethod.Post, new { @id = "mainForm" }))
    {    
        <input type="text" name="questionToBeAdded.Answers[0]" value="ff" />
        <input type="text" name="questionToBeAdded.Answers[1]" value="ddds" />
        <input type="text" name="questionToBeAdded.Answers[2]" value="ff" />
        <input type="text" name="questionToBeAdded.Answers[3]" value="ddds" />
        <input type="text" name="questionToBeAdded.Answers[4]" value="ff" />
        <input type="text" name="questionToBeAdded.Answers[5]" value="ddds" /> 
        <input value="Add question" type="submit" style="position: static; width: 10em; height: 3em;
            font-size: 1em;" />
    }   

默认的模型绑定器会在我发布时获取我的值,但我的val始终为null
为什么会这样?
(应该提到这是解决this更大问题的尝试。)

编辑1:
这是应该受约束的行动

   [HttpPost]
   public ActionResult AddQuestionSimple(PMP.WebUI.Models.UserInteractionEntities.UserInput.QuestionSimple questionToBeAdded)
    {
        return View("AddQuestion");
    }

感谢。

1 个答案:

答案 0 :(得分:0)

首先,您必须覆盖BindModel,因此您的方法将以:

开头
public override object BindModel

接下来,您在bindingContext.ValueProviders中找不到包含“questionToBeAdded”键的值。调试并查看该集合,bindingContext.ValueProviders [1]有一个FormValueProvider,其中包含模型的所有属性。你这样做的方式,你可能需要手动迭代。另一种方法是覆盖BindProperty方法,只需输入:

protected override void BindProperty

在模型binder类中,您将获得填写的方法签名(假设您继承自DefaultModelBinder)。在这种方法中,您将获得有关每个属性的更多详细信息,并为您完成管道。