Asp.net mvc 4 提交后模型为空

Asp.net mvc 4 提交后模型为空,asp.net-mvc-4,Asp.net Mvc 4,我想知道为什么ContactController中的ContactModel没有填写表单中提供的值。我的头在哪里爆炸了 按原样编码: HomeController(联系人表单所在位置) 家庭视图模型 public class HomeViewModel { public ContactModel ContactModel { get; set; } } 用于保存值的ContactModel public class HomeController : Controller { p

我想知道为什么ContactController中的ContactModel没有填写表单中提供的值。我的头在哪里爆炸了

按原样编码:

HomeController(联系人表单所在位置)

家庭视图模型

public class HomeViewModel
{
    public ContactModel ContactModel { get; set; }
}
用于保存值的ContactModel

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var viewModel = new HomeViewModel();
        return View(viewModel);
    }
}
public class ContactModel
{
    [Required(ErrorMessage = "Required")]
    public String Name { get; set; }

    [EmailAddress]
    [Required(ErrorMessage = "Required")]
    public String Email { get; set; }

    [Required(ErrorMessage = "Required")]
    public String Message { get; set; }
}
HomeController的索引视图

@model MyNameSpace.ViewModels.HomeViewModel

@using (Html.BeginForm("Send", "Contact", FormMethod.Post))
{
    <div class="form-group">
        @Html.LabelFor(model => model.ContactModel.Name, "Name", new { @class = "sr-only" })
        @Html.TextBoxFor(model => model.ContactModel.Name, new { @class = "form-control", @placeholder = "Name" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.ContactModel.Email, "E-mail", new { @class = "sr-only" })
        @Html.TextBoxFor(model => model.ContactModel.Email, new { @class = "form-control", @placeholder = "E-mail" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.ContactModel.Email, "Message", new { @class = "sr-only" })
        @Html.TextAreaFor(model => model.ContactModel.Message, new { @class = "form-control", @placeholder = "Message" })
    </div>
    <p><button type="submit" class="btn btn-default">Send</button></p>
}

由于我的表单提交中的某些原因,在
ContactController.Send(ContactModel model)
中提供的模型具有所有空值-链接在哪里断开?

您的POST操作应将视图模型作为参数,而不是域模型:

[HttpPost]
public ActionResult Send(HomeViewModel model)
原因很简单——这是默认模型绑定器的工作方式。视图中的输入字段都以
ContactModel
为前缀

或者,您可以使用
Bind
属性并明确指定:

[HttpPost]
public ActionResult Send([Bind(Prefix = "ContactModel")] ContactModel model)

因此,如果我希望从多个位置使用ContactController.Send(ContactModel模型),那么这是最好的设计,我会将其移动到某个帮助器类或什么是好的设计?在这种情况下,我看不到您在视图中使用的
HomeViewModel
类有多大好处。它所做的只是将您的域模型包装在一个属性中,而不是视图模型应该如何工作。
[HttpPost]
public ActionResult Send([Bind(Prefix = "ContactModel")] ContactModel model)