Asp.net mvc 如何在ASP.NET MVC中创建可编辑的局部视图

Asp.net mvc 如何在ASP.NET MVC中创建可编辑的局部视图,asp.net-mvc,razor,Asp.net Mvc,Razor,我目前正在尝试创建一个编辑视图,该视图由一些用户配置文件详细信息和用户分配到的角色列表组成。我认为我可以创建一个可编辑的父视图,其中包含所有用户配置文件文本框,并插入一个局部视图,其中包含所有角色的复选框 但是,我发现,当我尝试更新部分视图中的文本框时,这些更改不会反映在父模型中。显然,部分视图获得了自己的ViewData字典,该字典与父视图的字典隔离 我想知道是否有人有一个解决方案,允许我将对部分视图中复选框所做的更改传递回父视图的模型。我在下面包含了一些示例代码。以下是父视图: @model

我目前正在尝试创建一个编辑视图,该视图由一些用户配置文件详细信息和用户分配到的角色列表组成。我认为我可以创建一个可编辑的父视图,其中包含所有用户配置文件文本框,并插入一个局部视图,其中包含所有角色的复选框

但是,我发现,当我尝试更新部分视图中的文本框时,这些更改不会反映在父模型中。显然,部分视图获得了自己的ViewData字典,该字典与父视图的字典隔离

我想知道是否有人有一个解决方案,允许我将对部分视图中复选框所做的更改传递回父视图的模型。我在下面包含了一些示例代码。以下是父视图:

@model MvcWebsite.ViewModels.UserProfileEditViewModel

@{
ViewBag.Title = "Edit";
}

<h2>Edit</h2>

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>UserProfile</legend>

    @Html.HiddenFor(model => model.UserId)

    <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
    </div>

... other properties of the user profile omitted for brevity

    <div class="editor-field">

        @Html.Partial("RoleCheckBoxEditTable", Model.Roles)
    </div>
    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>
@model MvcWebsite.ViewModels.UserProfileEditViewModel
@{
ViewBag.Title=“编辑”;
}
编辑
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
用户配置文件
@Html.HiddenFor(model=>model.UserId)
@LabelFor(model=>model.UserName)
…为简洁起见,省略了用户配置文件的其他属性
@Html.Partial(“RoleCheckBoxEditTable”,Model.Roles)

} @ActionLink(“返回列表”、“索引”)
然后我们有了子部分视图:

@model List<MvcWebsite.ViewModels.RoleViewModel>

<table>
<tr>
    @{
        int count = 0;
        foreach (var roleViewModel in Model)
        {
            if(count++ % 3 == 0)
            {
                @: </tr> <tr>
            }
            <td>
                @Html.HiddenFor(r => roleViewModel.RoleName) 
                @Html.HiddenFor(r => roleViewModel.RoleId) 
                @Html.CheckBoxFor(r => roleViewModel.Assigned)
            </td>
            <td>
                @Html.LabelFor(r => roleViewModel.Assigned, roleViewModel.RoleName)
            </td>
        }
    }

</tr>
</table>
@型号列表
@{
整数计数=0;
foreach(模型中的var roleViewModel)
{
如果(计数+++%3==0)
{
@:  
}
@HiddenFor(r=>roleViewModel.RoleName)
@HiddenFor(r=>roleViewModel.RoleId)
@CheckBoxFor(r=>roleViewModel.Assigned)
@LabelFor(r=>roleViewModel.Assigned,roleViewModel.RoleName)
}
}

我想要的是找到一种方法使这两个视图更新同一个模型,然后将其发送给控制器。任何帮助都将不胜感激。

我解决了这个问题,完全消除了部分视图,并将其替换为显示和编辑器模板

从您的视图中获取
RoleViewModel
列表的内容,并在
Views/Shared/EditorTemplates
下创建一个名为
RoleViewModel.cshtml
的新视图(如果您以前从未使用过
EditorTemplates

在顶级视图中,将
Partial
更改为
EditorFor
,如下所示:
@Html.EditorFor(model=>model.Roles)


这种方法对我很有效,它保留了我在模型上使用
IValidatable
接口得到的烘焙验证

嗨,格雷厄姆,我以前试过这种方法,我只能为RoleViewModel创建一个EditorTemplate。实际上,我想为RoleViewModels列表创建一个EditorTemplate,该列表将对应于list,这是roles属性的实际类型。如果使用
Hidden
方法而不是
HiddenFor
,则可以指定字段的名称,而不是由MVC为您指定。或者,我认为
HiddenFor
是重载的,所以您可以这样指定它