0

在我的示例MVC应用程序,我有一个模型更新局部视图模型值提交

class SampleModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Certification> Certifications { get; set; } 
} 

class Certification 
{ 
    public int Id { get; set; } 
    public string CertificationName { get; set; } 
    public int DurationInMonths { get; set; } 
} 

我的视图(我需要在一个局部视图中显示的认证信息)

@model SampleApplication.Model.SampleModel 
<!-- other code... --> 
@using (Html.BeginForm("SaveValues","Sample", FormMethod.Post, new { id= "saveForm" })) 
{ 
    @Html.HiddenFor(m => m.Id, new { id = "hdnID" }) 
    @Html.TextBoxFor(m => m.Name, new { id = "txtName" }) 
    @{Html.RenderPartial("_CertDetails.cshtml", Model.Certifications);} 
    <input type="submit" id="btnSubmit" name="btnSubmit" value="Update" /> 
} 

局部视图

@model List<SampleApplication.Model.Certification> 
<!-- other code... --> 
@if (@Model != null) 
{ 
    for (int i = 0; i < @Model.Count; i++) 
    { 
     @Html.HiddenFor(m => m[i].Id , new { id = "CId" + i.ToString() }) 
     @Html.TextBoxFor(m => m[i].CertificationName,new{ id ="CName" + i.ToString() }) 
     @Html.TextBoxFor(m => m[i].DurationInMonths,new{ id ="CDur" + i.ToString() }) 
    } 
} 

控制器

[HttpPost] 
public ActionResult SaveValues(SampleModel sm) 
{ 
    //Here i am not getting the updated Certification details (in sm) 
} 

如何到局部视图的更新值在表单提交后,我的控制器?当我不使用partialview时,我能够获得更新的认证值。 这是正确的方式,还是应该遵循其他一些方法?

回答

1

哦拿去......这是我的错:(。我给认证列表作为我的partialview模型

@model List<SampleApplication.Model.Certification> 

但我应该用在局部视图也同型号(主要页面模型)。

@model SampleApp.Models.SampleModel 

在局部视图编码会像

 @for (int i = 0; i < @Model.Certifications.Count; i++) 
     { 
      @Html.HiddenFor(m => m.Certifications[i].Id, new { id = "CId" + i.ToString() }) 
      @Html.TextBoxFor(m => m.Certifications[i].CertificationName, new { id = "CName" + i.ToString() }) 
      @Html.TextBoxFor(m => m.Certifications[i].DurationInMonths, new { id = "CDur" + i.ToString() })<br /><br /> 
     } 

现在我正在更新的值在我的控制器中。

谢谢@Chris Pratt的提示。

2

如果sm.Certifications是回来了零,这意味着要么没有被张贴为,或模型绑定器无法将发布的数据正确安装。

在您的部分中,您正在使用索引器正确定义字段,但最初Certifications是空列表,因此该代码从未实际运行。这意味着,在其他地方您有添加新Certification领域的页面,动态一些JavaScript逻辑,我的猜测是,您的JavaScript生成字段名称不遵循的ModelBinder的预期索引约定。您的所有字段应在以下格式:

ListProperty[index].PropertyName 

所以你的情况,你的JS应该产生类似的名称:

Certifications[0].CertificationName 

为了要能正确地绑定数据。

+0

嗨克里斯感谢您的答复......我添加了一些认证值的模型。这些值正在呈现正确。当我更新这些值并发布表单时,我得到更新的“示例”,但“认证”中的内容为空。如果我使用相同的方法,是否有可能获得这些值? – san

+0

是的,再次,如果它为空,则什么都没有公布(请确保你没有做一些愚蠢像使用多个'

'元素;你想调回一切都需要在同一个'') - 或 - 这些字段的名称不在模型绑定器可以理解的约定中。 –