Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架从ASP.NET MVC(C)中的下拉列表中获取SelectedValue_C#_Asp.net Mvc_Drop Down Menu_Modelbinders_Selectedvalue - Fatal编程技术网

C# 使用实体框架从ASP.NET MVC(C)中的下拉列表中获取SelectedValue

C# 使用实体框架从ASP.NET MVC(C)中的下拉列表中获取SelectedValue,c#,asp.net-mvc,drop-down-menu,modelbinders,selectedvalue,C#,Asp.net Mvc,Drop Down Menu,Modelbinders,Selectedvalue,对不起,如果这是一个重复的问题,我扫描了相关的问题,没有看到任何明显的 我正在使用一个带有Entity对象的EditModel,以及其中的两个SelectList。问题是,一旦我到达POST action,两个下拉列表的SelectedValue仍然是我在构造函数中为模型设置的相同默认值,无论我在浏览器上实际选择了什么 我的构造函数为SelectedValues设置了一些默认值,但它们只是0,在下拉列表中不是有效值。我有一种感觉,问题不知怎么围绕着这个,但我会给出更多细节 以下是该模型的精简版本

对不起,如果这是一个重复的问题,我扫描了相关的问题,没有看到任何明显的

我正在使用一个带有Entity对象的EditModel,以及其中的两个SelectList。问题是,一旦我到达POST action,两个下拉列表的SelectedValue仍然是我在构造函数中为模型设置的相同默认值,无论我在浏览器上实际选择了什么

我的构造函数为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 dictionary时,示例更加直截了当,但我没有找到太多尝试对SelectList使用直接模型绑定的示例

非常感谢您的帮助


Chris

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

<%= Html.DropDownList("Organization.ID", Model.Organizations) %>

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

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

public int ID { get; set; }
public string Name { get; set; }
控制器动作如下:

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

请注意,如果出现验证错误,您需要重新填充SelectList属性以重新组合菜单。

控制器代码是什么样子的?您可以发布一些UserAccountData结构的代码吗?如果您绑定到ViewModel,那么我想SelectList的名称应该是UserAccountData.ID和UserAccountData.name,我不确定,因为我不知道UserAccountData的结构UserAccountData是一个实体,其代码由实体框架生成。然而,我应该提到的另一条信息是,组织和角色是数据库中UserAccount表中的外键。添加UserAccount时,我希望能够从数据库中现有的选择中选择组织和角色。上面模型上的UpdateModel方法用于将所选组织和角色添加到UserAccountData,但不确定控制器代码是否添加了任何内容。我只是在调用POST操作时设置了一个断点,我希望模型中SelectList的SelectedValue值能够根据下拉列表中选择的内容进行设置。如果不是这样,那么看起来我只需要在模型上添加SelectedValues名称和ID作为显式属性。那么,模型上的SelectList属性不会得到更新?我希望看到SelectList上的SelectedValue更新为视图中的实际选定值,然后我会从SelectList中提取该值并更新我的UserAccountData。如果不是这样,那么我将接受您的建议并添加要更新的显式属性。否。因为表单post中只返回选定的值,所以它甚至没有用于重新填充选择列表的数据。我总是为我在模型中使用的IEnumerable枚举和所选值输入属性。我唯一的问题是我在存储库后面使用实体框架。我实际上是在查询要在SelectList中列出的完整对象,因为它们非常小。因此,我已经从数据库中获取了整个对象。然后是否在选择列表中查找SelectedValue ID以获取完整数据?如果缓存了列表,则选择“是”,否则需要重新查询。如果要重新构建整个对象,则需要将表单上每个对象的所有数据都放在选择列表中,并将其发回。模型绑定器唯一需要处理的就是发布的数据。如果使用缓存,或者使用自定义模型绑定器,则可以从中重新构建整个列表。我会说这是一个优化,我可能会重新询问,直到我知道这将是一个性能问题。自定义绑定可能是一个很好的选择,这也是一个同事刚刚向我提到的。我想我会玩一点,否则我会使用上面更简单的选项。再次感谢!我想这可能也很简单,但我已经确认了这条路,我认为它是正确的。Organizations Pluble实际上是组织对象的SelectList,因此ID不作为组织的成员存在。我想我需要将Organizations.SelectedValue转换为Organization类型,但我不确定如果在视图中,这将如何工作。不过,我愿意接受建议 在我看来,SelectedValue无法正确设置是不对的!