绑定ViewModel的一部分

时间:2011-08-20 16:15:11

标签: asp.net-mvc

我有以下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中找不到

2 个答案:

答案 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" />
<%} %>