在控制器中接收数据时,模型是否保持其结构?

时间:2015-10-18 18:09:18

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我不确定我是否已在主题中正确地提出了问题,但我会尽力向我解释我的问题。

我有ContactUsModel以下是HomeViewModel的一部分,更好的说是单个model中的嵌套模型类

public class ContactUsDataModel
{
   public string ContactName { get; set; }
   public string ContactEmail { get; set; }
   public string ContactMessage { get; set; }
   public string ContactPhone { get; set; }
}

我在Model中提到HomeViewModel,如下所示:

public class HomeViewModel
{
   /*My other models goes here*/
   public ContactUsDataModel CUDModel { get; set; }
}

现在在Index.cshtml视图中,我强烈创建了一个表单视图,如下所示:

@model ProjectName.Models.HomeViewModel
<!--I have other views for other models-->
@using (Html.BeginForm("ContactPost", "Home", FormMethod.Post, new { id = "contactform" }))
{
    @Html.TextBoxFor(m => m.CUDModel.ContactName, new { @class="contact col-md-6 col-xs-12", placeholder="Your Name *" })
    @Html.TextBoxFor(m => m.CUDModel.ContactEmail, new { @class = "contact noMarr col-md-6 col-xs-12", placeholder = "E-mail address *" })
    @Html.TextBoxFor(m => m.CUDModel.ContactPhone, new { @class = "contact col-md-12 col-xs-12", placeholder = "Contact Number (optional)" })
    @Html.TextAreaFor(m=>m.CUDModel.ContactMessage, new { @class = "contact col-md-12 col-xs-12", placeholder = "Message *" })
    <input type="submit" id="submit" class="contact submit" value="Send message">
 }

ajax发布如下:

$('#contactform').on('submit', function (e) {
   e.preventDefault();
   var formdata = new FormData($('.contact form').get(0));
   $.ajax({
            url: $("#contactform").attr('action'),
            type: 'POST',
            data: formdata,
            processData: false,
            contentType: false,
            //success
            success: function (result) {
                //Code here
            },
            error: function (xhr,responseText,status) {
                //Code here
            }
    });
});

在控制器中我尝试按以下方式接收它:

public JsonResult ContactPost(ContactUsDataModel model)
{
     var name=model.ContactName; //null
     /*Fetch the data and save it and return Json*/
     //model is always null
}

出于某种原因,上述模型始终为null。但是,如果我在控制器参数中将model引用为HomeViewModel model而不是ContactUsDataModel model,则此方法有效:

public JsonResult ContactPost(HomeViewModel model)
{
     var name=model.CUDModel.ContactName; //gets value
     /*Fetch the data and save it and return Json*/
     //Model is filled.
}
  

我的问题是即使我填写model类型   ContactUsDataModel在视图中,如果我提及,我将其null   直接,但ContactUsModel内的HomeViewModel得到   填充。这里没有型号的类型。层次结构是它的   在控制器中获取时需要引用吗?

3 个答案:

答案 0 :(得分:4)

好吧,如果您生成的<input>名称为CUDModel.ContactName而不是ContactName,则默认的Model-Binder将无法绑定它。

幸运的是,您可以使用带有前缀的[Bind]属性:

public JsonResult ContactPost([Bind(Prefix="CUDModel")]ContactUsDataModel model)
{
    // ...
}

请参阅MSDN

答案 1 :(得分:1)

使用您的网络浏览器,检查每个DOM输入元素&#34; name&#34;属性。 MVC使用输入&#34;&#34; name&#34;自动将输入中的属性映射到类。属性。

要解决此问题,您可以手动创建自定义模型绑定器或创建输入,指定name属性,使自动模型绑定器可以将它们与类的属性相匹配。

但是,以HomeViewModel为参数的控制器操作没有任何问题。

更多信息,找到here

答案 2 :(得分:1)

您的视图会在视图中发布您引用的类型 - @model ProjectName.Models.HomeViewModel - CUDModel只是HomeViewModel的一个属性。