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 时,我能够获得更新的认证值。这是正确的方法还是我应该遵循其他方法?

4

2 回答 2

2

如果sm.Certifications返回 null,则意味着没有为此发布任何内容,或者模型绑定器无法正确附加发布的数据。

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

ListProperty[index].PropertyName

因此,在您的情况下,您的 JS 应该生成如下名称:

Certifications[0].CertificationName

为了正确绑定数据。

于 2014-03-24T14:14:01.130 回答
1

哦,不...这是我的错误:(。我将认证列表作为我的局部视图模型

 @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 的提示。

于 2014-03-24T16:23:37.140 回答