我有以下ViewModel
public class NewCustomerViewModel {
public long CustomerId {get;set;}
public NewCustomerFormViewModel NewCustomerForm {get;set; }
}
NewCustomerFormViewModel仅包含作为表单一部分的字段。只有他们我想验证。所以我想拥有以下Action签名:
[HttpPost]
public ActionResult NewCustomer(long battleId,
NewCustomerFormViewModel newCustomerFormViewModel)
不幸的是它不适用于默认的ModelBinder。那么将NewCustomerViewModel的属性绑定到NewCustomerFormViewModel的最简单方法是什么?
更新。以下是我观点的一部分:
Title @ Html.TextBoxFor(m => m.NewCustomerForm.Title, Model.NewCustomerForm.Title)
因此,ModelBinder会查找NewCustomerForm属性,而这个属性在NewCustomerForViewModel中找不到
答案 0 :(得分:3)
ASP.NET MVC在很大程度上依赖于解析视图,操作,控制器甚至参数的命名约定。这些参数可能在NewCustomerForm
命名空间(例如NewCustomerForm.Name=John
)下发布,因为它们是如何适合您为其生成输入的模型。尝试将参数重命名为newCustomerForm
,以便活页夹实际上确实找到了该名称的对象。
[HttpPost]
public ActionResult NewCustomer(long battleId,
NewCustomerFormViewModel newCustomerForm)
答案 1 :(得分:0)
由于您未提供控制器代码和查看代码,因此我可能无法100%确定您的要求。但正如我所知,您希望机制在验证和绑定下包含'NewCustomerForm'并排除'CustomerId'。
就是这种情况,然后尝试以下代码。
排除您不想绑定的属性。
[Bind(Exclude = "CustomerId")]
public class NewCustomerViewModel
{
public long CustomerId { get; set; }
public NewCustomerFormViewModel NewCustomerForm { get; set; }
}
public class NewCustomerFormViewModel
{
public string Name { get; set; }
public string Title { get; set; }
}
public class TestController : Controller
{
public ActionResult Index(string username )
{
NewCustomerViewModel model = new NewCustomerViewModel();
model.NewCustomerForm = new NewCustomerFormViewModel();
return View(model);
}
[HttpPost]
public ActionResult IndexPost(NewCustomerViewModel m)
{
UpdateModel(m);
return View("index",m);
}
}
<h2>Index</h2>
<% using (Html.BeginForm("indexpost","test")) {%>
<%: Html.TextBoxFor(m => m.CustomerId, Model.CustomerId)%>
<%: Html.TextBoxFor(m => m.NewCustomerForm.Title, Model.NewCustomerForm.Title)%>
<%: Html.TextBoxFor(m => m.NewCustomerForm.Name, Model.NewCustomerForm.Name)%>
<input type="Submit" value="submit" />
<%} %>