2012-03-03 138 views
1

当我尝试从包含相同部分视图两次的页面传回值时遇到问题。 我类definiton是象下面这样:MVC,将页面中多个部分视图的值传回

public class Account : IEntity 
{ 

    public decimal CurrentBalance { get; set; } 
    public List<Person> AccountHolders { get; set; } 
    //to get round the non-existing enum support in EF4.3 wrap enum to int 
    public int StatusValue { get; set; } 
    public AccountStatus Status { get { return (AccountStatus)StatusValue; } set { StatusValue = (int) value; } } 

    public DateTime AccountOpenDate { get; set; } 
    public DateTime AccountCloseDate { get; set; } 
    public DateTime AccountSuspensionDate { get; set; } 
    } 

它的人,这我为一个局部视图(用于单个的一个)的一个列表。

<fieldset> 
    <legend>Person</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Name) 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 
     <div class="editor-label"> 
     @Html.LabelFor(model => model.Age) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Age) 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 
</fieldset> 

在账户的创建页面中,我包含了2个我创建的部分视图,如下所示。

<div id="Person1"> 
     @Html.Partial("_CreateAccountHolder") 
    </div> 

    <div id="Person2"> 
     @Html.Partial("_CreateAccountHolder") 
    </div> 

当我看到什么是贴后背,它所包含的值(姓名和年龄作为人的属性),我把在页面的表单值,我有让他们的拖车预期: CurrentBalance = 19个&状态=关闭& AccountOpenDate = 12%2F12%2F2012 &名称=穆斯塔法&年龄= 20 &名称=索菲亚&年龄= 20 & AccountCloseDate = 12%2F12%2F2012 & AccountSuspensionDate = 12%2F12%2F2012

但是当我看看我的控制器上的创建方法我看到AccountHolder列表为空。我试着用不同的签名...... 公众的ActionResult创建(账户personalaccount,人[]账户持有人) 公众的ActionResult创建(账户personalaccount,列出账户持有人)

如果我只有人的一个局部视图,并有我的控制器一样这,我可以看到正确绑定的Person对象。 public ActionResult创建(账户个人账户,个人账户管理)

任何想法,我要去哪里错了?

回答

2

或者你可以手动指定前缀,当你把你的局部视图。我有一点点写了关于他们在这里:

codenodes.wordpress.com - MVC3 Editor Templates

要创建一个模板编辑:

  • ,如果你不已经有一个文件夹,名为“EditorTemplates”中的Web项目中的解决方案,然后在Views \ Shared文件夹中创建一个。
  • 添加一个新的局部视图并将其命名为您要渲染的模型,在您的情况下为Person,因此您将其称为Person.cshtml(我知道局部视图应该以下划线“_”开头,但是对于编辑器模板,它需要与模型命名相同)。
  • 将您的“_CreateAccountHolder”局部视图中的代码粘贴到新的Person.cshtml编辑器模板中。
  • 在创建页面正是如此渲染你的账户持有人名单:
<div id="People"> 
    @Html.EditorFor(x => x.AccountHolders) 
</div> 

如果你需要有大约每个人单独申报单,那么你可以将这些添加到您的编辑模板。编辑器模板的好处在于,即使列表中有多个Person对象,只需要对该模板进行单一调用 - 无需循环或类似的任何东西,因为模板会自动呈现每个Person对象。它还名外地正确以便例如,如果你有你的收藏2个Person对象应该回来后是这样的:

AccountHolders[0].Name 
AccountHolders[0].Age 
AccountHolders[1].Name 
AccountHolders[1].Age 

这里是为您编辑模板代码:

@model Person 

<fieldset> 
    <legend>Person</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Name) 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 
     <div class="editor-label"> 
     @Html.LabelFor(model => model.Age) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Age) 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 
</fieldset> 
0

我读 [http://stackoverflow.com/questions/653514/asp-net-mvc-model-binding-an-ilist-parameter][1] 把2个部分的意见后理解我的问题相同的类型使视图返回名称和年龄对,没有任何东西在第一对和第二对之间。我改变了看法parial如下,但是真的不喜欢它...

<div class="editor-field"> 
     @Html.TextBox("person[0].Name", "") 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 

    <div class="editor-field"> 
     @Html.TextBox("person[0].Age", "") 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 

    <div class="editor-field"> 
     @Html.TextBox("person[1].Name", "") 
     @Html.ValidationMessageFor(model => model.Name) 
    </div> 
    <div class="editor-field"> 
     @Html.TextBox("person[1].Age", "") 
     @Html.ValidationMessageFor(model => model.Age) 
    </div> 

现在回发类似下面,我可以在我的控制器读取的IList ..

CurrentBalance = 19个&状态=关闭& AccountOpenDate = 12%2F12%2F2012 &人%5B0%5D.Name =穆斯塔法&人%5B0%5D.Age = 19 &人5B1%%5D.Name =索菲亚&人5B1%%5D.Age = 20 & AccountCloseDate = 10%2F10%2F2012 & AccountSuspensionDate = 12%2F12%2F2012

0

首先,你应该与AccountModel的两个实例,像创建CreateAccountModel:

public class CreateAccountModel 
{ 
    public Account Person1 { get; set; } 
    public Account Person2 { get; set; } 
} 

接下来,当你把你的局部视图,您应该个别车型传递给他们,E。g:

<div id="Person1"> 
    @Html.Partial("_CreateAccountHolder", Model.Person1) 
</div> 

<div id="Person2"> 
    @Html.Partial("_CreateAccountHolder", Model.Person2) 
</div> 

现在MVC会自动为所有帐户字段添加前缀PersonX,因此所有字段都是唯一的。如果我正确理解您的方案来完成,这是使用编辑器模板,而不是局部的看法的一种方式

{ 
    var prefixData = new ViewDataDictionary { TemplateInfo = { HtmlFieldPrefix = "Person1" } }; 
    Html.RenderPartial("_CreateAccountHolder", new ViewDataDictionary(prefixData)); 
} 
相关问题