ASP.NET MVC 中的重载 ViewModel 构造函数和 HttpPost
Overloaded ViewModel Constructor and HttpPost in ASP.NET MVC
我在 Whosebug 中找到的最接近我的问题是
Posting data when my view model has a constructor does not work
型号
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
ViewModel
public class CustomerViewModel
{
public Customer Customer { get; set; }
public CustomerViewModel(Customer customer)
{
Customer = customer;
}
}
控制器代码
public ActionResult CreateCustomer()
{
Customer c = new Customer();
CustomerViewModel cvm = new CustomerViewModel(c);
return View(cvm);
}
[HttpPost]
public ActionResult CreateCustomer(CustomerViewModel customer)
{
// do something here
}
查看代码
@model Blah.Models.CustomerViewModel
@{
ViewBag.Title = "CreateCustomer";
}
<h2>CreateCustomer</h2>
@using (Html.BeginForm())
{
<div class="editor-label">
@Html.LabelFor(model => model.Customer.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Customer.FirstName)
@Html.ValidationMessageFor(model => model.Customer.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Customer.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Customer.LastName)
@Html.ValidationMessageFor(model => model.Customer.LastName)
</div>
<p>
<input type="submit" value="Create" />
</p>
}
错误
只是消除错误但没有帮助的解决方案
- 添加默认构造函数(参数为空 - 不符合我的目的)
- 没有重载的构造函数(那时我的模型将是空的)
问题
我想我需要一个自定义模型活页夹。不知道如何创建一个:-(
(或)
我想知道我在这里还有哪些其他选择
您需要添加一个无参数构造函数。
public class CustomerViewModel
{
public Customer Customer { get; set; }
public CustomerViewModel()
{
}
public CustomerViewModel(Customer customer)
{
Customer = customer;
}
}
您认为这是 'not working' 的原因是另一个问题。您的模型有一个名为 Customer
的 属性,它是一个复杂类型,您的 POST 方法的参数也被命名为 customer
(DefaultModelBinder
不区分大小写).结果,绑定失败。您需要将参数名称更改为您的属性名称以外的任何名称,例如
[HttpPost]
public ActionResult CreateCustomer(CustomerViewModel model)
我在 Whosebug 中找到的最接近我的问题是 Posting data when my view model has a constructor does not work
型号
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
ViewModel
public class CustomerViewModel
{
public Customer Customer { get; set; }
public CustomerViewModel(Customer customer)
{
Customer = customer;
}
}
控制器代码
public ActionResult CreateCustomer()
{
Customer c = new Customer();
CustomerViewModel cvm = new CustomerViewModel(c);
return View(cvm);
}
[HttpPost]
public ActionResult CreateCustomer(CustomerViewModel customer)
{
// do something here
}
查看代码
@model Blah.Models.CustomerViewModel
@{
ViewBag.Title = "CreateCustomer";
}
<h2>CreateCustomer</h2>
@using (Html.BeginForm())
{
<div class="editor-label">
@Html.LabelFor(model => model.Customer.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Customer.FirstName)
@Html.ValidationMessageFor(model => model.Customer.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Customer.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Customer.LastName)
@Html.ValidationMessageFor(model => model.Customer.LastName)
</div>
<p>
<input type="submit" value="Create" />
</p>
}
错误
只是消除错误但没有帮助的解决方案
- 添加默认构造函数(参数为空 - 不符合我的目的)
- 没有重载的构造函数(那时我的模型将是空的)
问题
我想我需要一个自定义模型活页夹。不知道如何创建一个:-(
(或)
我想知道我在这里还有哪些其他选择
您需要添加一个无参数构造函数。
public class CustomerViewModel
{
public Customer Customer { get; set; }
public CustomerViewModel()
{
}
public CustomerViewModel(Customer customer)
{
Customer = customer;
}
}
您认为这是 'not working' 的原因是另一个问题。您的模型有一个名为 Customer
的 属性,它是一个复杂类型,您的 POST 方法的参数也被命名为 customer
(DefaultModelBinder
不区分大小写).结果,绑定失败。您需要将参数名称更改为您的属性名称以外的任何名称,例如
[HttpPost]
public ActionResult CreateCustomer(CustomerViewModel model)