我不确定我是否已在主题中正确地提出了问题,但我会尽力向我解释我的问题。
我有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
得到 填充。这里没有型号的类型。层次结构是它的 在控制器中获取时需要引用吗?
答案 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的一个属性。