2

抱歉,如果这是一个重复的问题,我扫描了相关问题并没有看到任何明显的问题。

我正在使用带有实体对象的 EditModel,以及其中的两个 SelectList。问题是,一旦我到达我的 POST 操作,无论我在浏览器上实际选择什么,两个下拉菜单的 SelectedValues 仍然是我在模型的构造函数中设置的默认值。

我的构造函数为 SelectedValues 设置了一些默认值,但它们只是 0 和 ""(它们不是下拉列表中的有效值)。我感觉问题以某种方式围绕着这个问题,但我会提供更多细节。

这是模型的精简版本:

public class UserAccountModel 
{

    public UserAccount UserAccountData { get; set; } // Entity from EF
    public SelectList Organizations { get; set; }
    public SelectList Roles { get; set; }

    public UserAccountModel() : this(null)
    {
    }


    public UserAccountModel(UserAccount obj)
    {
        UserAccountData = (obj == null) ? new UserAccount() : obj;

        // default selected value
        int orgChildId = (UserAccountData.Organization == null) ? 0 : UserAccountData.Organization.ID;
        string roleChildId = (UserAccountData.Role == null) ? "" : UserAccountData.Role.Name;

        // go get the drop down options and set up the property binding
        using (UserAccountRepository rep = new UserAccountRepository())
        {
            Organizations = new SelectList(rep.GetOrganizationOptions(), "ID", "ID", orgChildId);
            Roles = new SelectList(rep.GetRoleOptions(), "ID", "Name", roleChildId);
        }
    }

    public void UpdateModel()
    {
        UserAccountData.Organization = Organizations.SelectedValue as Organization;
        UserAccountData.Role = Roles.SelectedValue as Role;
    }
}

这是视图的下拉列表部分:

                <div class="field">
                <label for="ID">Organization:</label>
                <%= Html.DropDownList("ID", Model.Organizations) %>
            </div>

            <div class="field">
                <label for="Name">Role:</label>
                <%= Html.DropDownList("Name", Model.Roles) %>
            </div>

我可能在这里做了一些愚蠢而明显的事情。使用 ViewData 字典时,这些示例更加直接,但我找不到太多尝试对 SelectLists 使用直接模型绑定的示例。

任何帮助是极大的赞赏!

克里斯

4

2 回答 2

2

选择元素只回发所选它的实际值。在这种情况下,参数将作为 ID(组织)和名称(角色)在服务器/控制器处接收回。您用于更新操作的模型应该包含这些作为属性,或者您的控制器操作应该直接接受它们作为参数。模型上的列表不会被重新填充——而且名称在任何情况下都不匹配。

通过添加以下内容修改您的模型:

public int ID { get; set; }
public string Name { get; set; }

控制器动作为:

public ActionResult Update( UserAccountModel userAccount )
{
    ...
}

请注意,如果出现验证错误,您将需要重新填充 SelectList 属性(重构菜单)。

于 2009-12-14T01:33:14.137 回答
1

您只是忘记了 ID 属性的导航路径:)

<%= Html.DropDownList("Organization.ID", Model.Organizations) %>
于 2009-12-14T01:32:27.143 回答