加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 如何建模绑定实现接口的类?

发布时间:2020-12-16 07:32:13 所属栏目:asp.Net 来源:网络整理
导读:模型绑定工作正常,直到我在以下类的顶部实现接口: public class QuestionAnswer : IQuestionAnswer { public Int32 Row_ID { get; set; } public Int32 Column_ID { get; set; } public String Value { get; set; } } public class HiddenAnswer : IHiddenA
模型绑定工作正常,直到我在以下类的顶部实现接口:

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(内部服务器错误)

我用来建模绑定的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'),Value: $(this).val(),};

                answers.push(answerObject);
            });

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

            postForm(allAnswers);
        });

Controller Action如下所示:

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

            bc.SaveSurvey(answers);

            return null;
        }

我究竟做错了什么?

解决方法

what am i doing wrong?

您不能指望模型绑定器知道当它遇到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());

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读