将选定值从局部视图传递到主视图的viewmodel

时间:2011-10-14 13:46:03

标签: asp.net-mvc-3 html.dropdownlistfor asp.net-mvc-partialview

作为ASP.Net MVC3新手,我们有一个需要帮助的问题。 (这个帖子的底部也有问题。)

首先,我不确定以下是否是最好的解决方法,所以如果我们朝着错误的方向前进,请告诉我。我们希望使用部分视图来查找下拉列表。在某些情况下,查找将在多个位置完成,而且,数据不是我们的viewmodel的一部分。数据可能来自我们应用程序中的数据库或Web服务。一些数据在启动时加载,一些数据基于表单中选择的其他值。

我们从主视图中调用子操作,并返回包含我们获取的数据的部分视图。一旦用户选择了他们的选择,我们就不确定如何在主视图模型中存储所选的项目代码。

在我们的主要表格中,我们呼吁采取行动:

@model Apps.Model.ViewModels.AVMApplicationInfo
        ...
        <div class="editor-label">
            @Html.LabelFor(m => m.VMResidencyWTCS.DisplayState) 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.VMResidencyWTCS.DisplayState)
            @Html.DropDownListFor(m => m.VMResidencyWTCS.DisplayState, Apps.Model.Helpers.ResidencyStates.StateList)
            @Html.ValidationMessageFor(m => m.VMResidencyWTCS.DisplayState)
        </div>
        @Html.Action("DisplayCounties", "PersonalInfo")
        ...

在PersonalInfo控制器中:

    [ChildActionOnly]
    public ActionResult DisplayCounties()
    {
        IList<County> countiesDB = _db.Counties
            .OrderBy(r => r.CountyDescr)
            .Where(r => r.State == "WI"
             && r.Country == "USA")
            .ToList();

        //Create an instance of the county partial view model
        VMCounty countyView = new VMCounty();

        //Assign the available counties to the view model
        countyView.AvailableCounties = new SelectList(countiesDB, "CountyCd", "CountyDescr");

        return PartialView("_DisplayCounties", countyView);
    }

在_DisplayCounties局部视图中:

@model Apps.Model.ViewModels.VMCounty 
<div class="editor-label"> 
    @Html.LabelFor(m => m.CountyDescr) 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(x => x.SelectedCountyCd, Model.AvailableCounties) 
</div>

如何将SelectedCountyCd分配给主窗体视图模型中的字段(Apps.Model.ViewModels.AVMApplicationInfo)?是否存在调用子操作/部分视图的问题;即,它是否在启动时加载,是否可以使用此方法将用户选择包括为查找过滤器?如果是这样,该值如何传递给子控制器; viewbag?

1 个答案:

答案 0 :(得分:1)

您可以将其作为参数传递给子操作:

@model Apps.Model.ViewModels.AVMApplicationInfo
...
@Html.Action("DisplayCounties", "PersonalInfo", new { 
    selectedCountyCd = Model.CountyCd // or whatever the property is called
})

然后让子操作将此值作为参数:

[ChildActionOnly]
public ActionResult DisplayCounties(string selectedCountyCd)
{
    IList<County> countiesDB = _db.Counties
        .OrderBy(r => r.CountyDescr)
        .Where(r => r.State == "WI"
         && r.Country == "USA")
        .ToList();

    //Create an instance of the county partial view model
    VMCounty countyView = new VMCounty();

    //Assign the available counties to the view model
    countyView.AvailableCounties = new SelectList(countiesDB, "CountyCd", "CountyDescr");

    // assign the selected value to the one passed as parameter from the main view
    countyView.SelectedCountyCd = selectedCountyCd;

    return PartialView("_DisplayCounties", countyView);
}