在部分视图中获取元素的id

时间:2011-09-28 08:56:35

标签: .net asp.net-mvc-3 razor partial-views

我认为 - 除其他外 - 包含元素列表。我想重用这个列表,所以我把它移到局部视图。我的视图包含一个表单,在帖子上我想在列表中包含一些值。因此,我使用@Html.EditorFor(m => m.Something)生成输入框,这将获得唯一的ID。该视图是强类型,使用“MyModel”作为模型。在帖子上,MVC框架可以很好地处理所有事情 - 将值重新组合到包含输入的MyModel对象和我使用Html.HiddenFor的一些字段。都好。

现在我将其移至局部视图。部分视图仅适用于列表,因此强类型化为List模型。我从主视图中包含此视图,并传入我希望它呈现的列表。部分视图中的表代码与之前的完全相同,只是它被更改为从列表而不是MyModel获取值。所有数据都完美显示,但存在问题。输入框不再获得Id。并且因为他们没有得到Id他们的值不包含在发布的表单中 - 因此他们没有出现在模型中我作为输入到我的post方法。我尝试使用@Html.Partial("_MyPartial", Model.Items)@{Html.RenderPartial("_MyPartial", Model.Items);}

包含部分视图

所以问题是;如何使用局部视图进行此工作?我如何才能获得该ID?

以下是一些示例代码,以防有任何不清楚的地方:

MyModel.cs
----------
public class MyClass 
{ 
    public string Val1 { get; set; }
    public string Val2 { get; set; }
}

public class MyModel
{
    public List<MyClass> Items {get; set; } 
}

MyView.cshtml: 
--------------
@model MyModel
using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post))
{
    @Html.Partial("_MyPartial", Model.Items)
}

_MyPartial.cshtml: 
------------------
@model List<MyClass>

<table>
    <tbody>
    for (var i = 0; i< Model.Count; i++)
    {
        <tr>
            <td>
                @Model[i].Val1
                @Html.HiddenFor(model => model[i].Val1)
            </td>
            <td>@Html.EditorFor(model => model[i].Val2)</td>
        </tr>
    }
    </tbody>
</table>

1 个答案:

答案 0 :(得分:1)

您也必须为Model.Items使用EditorFor。 因此,将_MyPartial更改为更相关的内容,例如MyEditorForMyClass.cshtml。 在共享或您正在使用的文件夹中创建一个“EditorTemplates”文件夹,然后将“MyEditorForMyClass.cshtml”文件放入其中。

然后执行以下操作:

MyView.cshtml: 

--------------
@model MyModel
using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post)
{
    @Html.EditorFor(model => Model.items,"MyEditorForMyClass"}

}

EditorFor templates / helper方法允许您渲染标准数据类型和包含多个属性的自己的复杂对象。