2012-05-30 70 views
4

的模型綁定工作正常,直到我對以下類別的基礎上實現的接口:如何建模綁定實現接口的類?

public class QuestionAnswer : IQuestionAnswer 
    { 

     public Int32 Row_ID { get; set; } 
     public Int32 Column_ID { get; set; } 
     public String Value { get; set; } 

    } 

    public class HiddenAnswer : IHiddenAnswer 
    { 

     public Int32 Hidden_Field_ID { get; set; } 
     public String Hidden_Field_Value { get; set; } 

    } 

    public class SurveyAnswer : ISurveyAnswer 
    { 

     public string SessionID { get; set; } 

     public List<IQuestionAnswer> QuestionAnswerList { get; set; } 

     public List<IHiddenAnswer> HiddenAnswerList { get; set; } 

     public SurveyAnswer() 
     { 
      QuestionAnswerList = new List<IQuestionAnswer>(); 
      HiddenAnswerList = new List<IHiddenAnswer>(); 
     } 
    } 

現在,接口在那裏,我得到一個500 (Internal Server Error)

,我使用模型綁定的JavaScript是以下:

$('#submitbutton').click(function() { 

      var answers = new Array(); 
      var hiddenfields = new Array(); 

      var formname = "#" + $("#formname").val(); 

      $(':input', formname).each(function() { 

       if ($(this).is(":text") || $(this).is(":radio") || $(this).is(":checkbox")) 
       { 
        var answerObject = { 
         Column_ID: $(this).attr('data-column_id'), 
         Row_ID: $(this).attr('data-row_id'), 
         Value: $(this).attr('data-theValue') 
        }; 

        answers.push(answerObject); 
       } 

       else if($(this).is(":hidden")) { 
        var hiddenObject = 
        { 
         Hidden_Field_ID: $(this).attr('data-hidden_field_id'), 
         Hidden_Field_Value: $(this).attr('data-hidden_field_value') 
        } 

        hiddenfields.push(hiddenObject); 
       } 
      }); 

      $('textarea', formname).each(function() { 
       var answerObject = { 
        Column_ID: $(this).attr('data-column_id'), 
        Row_ID: $(this).attr('data-row_id'), 
        Value: $(this).val(), 
       }; 

       answers.push(answerObject); 
      }); 

      var allAnswers = { 
       SessionID: 0, 
       QuestionAnswerList: answers, 
       HiddenAnswerList: hiddenfields 
      } 

      postForm(allAnswers); 
     }); 

控制器中的操作是這樣的:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult SubmitSurvey(SurveyAnswer answers) 
     { 
      // Dette tillader CORS 
      Response.AppendHeader("Access-Control-Allow-Origin", "*"); 

      bc.SaveSurvey(answers); 

      return null; 
     } 

我做錯了什麼?

+0

你的控制器動作是怎樣的? – nemesv

+0

查看我的更新後的問題 – Kenci

回答

12

我做錯了什麼?

你不能指望模型綁定要知道,當它遇到你的SurveyAnswer視圖模型的IQuestionAnswer接口應該使用QuestionAnswer類型。很高興你已經聲明瞭這個接口的實現,但是模型綁定器不知道它。

所以,你將不得不寫的IQuestionAnswer接口的自定義模型粘合劑(同爲IHiddenAnswer接口),並註明你要使用哪一個實現:

public class QuestionAnswerModelBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     var type = typeof(QuestionAnswer); 
     var model = Activator.CreateInstance(type); 
     bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type); 
     return model; 
    } 
} 

將在您的Application_Start註冊:

ModelBinders.Binders.Add(typeof(IQuestionAnswer), new QuestionAnswerModelBinder()); 
+0

感謝您和往常一樣的良好答案:)我已經實現了自定義模型粘合劑,它的工作原理。當您添加自定義模型聯編程序時,它必須是typeof(IQuestionAnswer)和typeof(IHiddenAnswer)才能工作。 – Kenci

+0

@Kenci,是的,這是正確的。我已經更新了我的答案。感謝您指出了這一點。 –

+0

非常感謝,Darin! – Schnapz

相關問題