【问题标题】:How bind property in model from json in asp.net mvc5如何从asp.net mvc5中的json绑定模型中的属性
【发布时间】:2016-10-25 11:40:58
【问题描述】:

我在 Asp.net mvc5 中有一个 viewModel,其中包含一个对象:

public class ConvenioViewModel
{
     public Convenio Convenio { get; set; }
     public string AnotherProperty {get;set;}
}

我需要在表单提交中使用 json 填充此属性,因为我在隐藏的输入中填充了此属性:

        @Html.HiddenFor(x => x.Convenio, new { @id = "convenioJson" })

我的 Javascript 是这样的:

$('#convenioJson').val(JSON.stringify(data.List[i]));

我的 Json 是这样的:

"{'Descricao':'UNIMED                   ','Id':1,'CodigoLogin':'bortolop','DataStamp':'/Date(903621226000)/'}"

但当我提交此表单时,我的属性“Convenio”为空。 在表单提交中填充它的方法是什么?在阿贾克斯 我已经知道了

【问题讨论】:

  • 是的,我会编辑问题
  • Convenio 是一个复杂的对象。您不能将复杂对象绑定到输入(查看您生成的 html)。您需要模型的每个属性的输入。但这有什么意义 - 它们不能被编辑,所以如果你需要 POST 方法中的对象,那么就重新获取它
  • 好的,对于我的视图模型对象中的每个属性,我需要像输入一样绑定..我真的明白

标签: c# jquery razor asp.net-mvc-5


【解决方案1】:

它不起作用,因为 String 类型无法解析为复杂对象。您应该像这样创建自定义数据绑定器:

public class ConvenioViewModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ConvenioViewModel viewModel = new ConvenioViewModel() {};

        string jsonConvenio = bindingContext.ValueProvider.GetValue("convenio").AttemptedValue;

        JavaScriptSerializer jss = new JavaScriptSerializer();
        viewModel.Convenio = jss.Deserialize<Convenio>(jsonConvenio);

        return viewModel;
    }
}

在 Application_Start() 中添加

ModelBinders.Binders.Add(typeof(ConvenioViewModel), new ConvenioViewModelBinder());

就是这样!

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多