如何让我的ListBox正常工作

时间:2015-04-14 10:11:07

标签: c# asp.net-mvc linq asp.net-mvc-4 razor

我试图让列表框正常工作,这将非常像这样。

Available练习是从迁移/配置中播种的。我需要能够将每个练习的倍数从Available添加到Selected Regime。我正在使用视图模型从另一个项目(UserRegimeItems)访问多个模型。然而,我只是不知所措。

Controller.cs

    [HttpGet]
    public ActionResult Exercise(int? id)
    {
        User user = db.Users.Find(id);
        UserExerciseViewModel model = new UserExerciseViewModel { AvailableExercises = GetAllExercises(), RequestedExercises = new List<RegimeItem>() };
        return View(model);
    }

    //Post
    [HttpPost]
    public ActionResult Index(UserExerciseViewModel model, string add, string remove, string send, int id)
    {
        User user = db.Users.Find(id);
        //ModelState.Clear();
        RestoreSavedState(model);
        if (!string.IsNullOrEmpty(add))
            AddExercises(model);
        else if (!string.IsNullOrEmpty(remove))

        SaveState(model);
        return View(model);
    }

    void SaveState(UserExerciseViewModel model)
    {

        model.SavedRequested = string.Join(",", model.RequestedExercises.Select(p => p.RegimeItemID.ToString()).ToArray());


        model.AvailableExercises = GetAllExercises().Except(model.RequestedExercises).ToList();
    }

    void RemoveExercises(UserExerciseViewModel model)
    {
        if (model.RequestedSelected != null)
        {
            model.RequestedExercises.RemoveAll(p => model.RequestedSelected.Contains(p.RegimeItemID));
            model.RequestedSelected = null;
        }
    }

    void AddExercises(UserExerciseViewModel model)
    {
        if (model.AvailableSelected != null)
        {
            var prods = GetAllExercises().Where(p => model.AvailableSelected.Contains(p.RegimeItemID));
            model.RequestedExercises.AddRange(prods);
            model.AvailableSelected = null;
        }
    }

    void RestoreSavedState(UserExerciseViewModel model)
    {
        model.RequestedExercises = new List<RegimeItem>();

        //get the previously stored items
        if (!string.IsNullOrEmpty(model.SavedRequested))
        {
            string[] prodids = model.SavedRequested.Split(',');
            var prods = GetAllExercises().Where(p => prodids.Contains(p.RegimeItemID.ToString()));
            model.RequestedExercises.AddRange(prods);
        }
    }

    public ViewResult Done()
    {
        return View();
    }

    public List<RegimeItem> GetAllExercises()
    {
        var items = db.RegimeItems.ToList();
    }

UserExerciseViewModel.cs

namespace FaceToFaceWebsite.Models
{
    public class UserExerciseViewModel
    {
        public List<RegimeItem> AvailableExercises { get; set; }
        public List<RegimeItem> RequestedExercises { get; set; }

        public int[] AvailableSelected { get; set; }
        public int[] RequestedSelected { get; set; }
        public string SavedRequested { get; set; }
    }
}

迁移/ Configuration.cs

protected override void Seed(FaceToFace.Model.F2FData context)
        {
var ahPose = new Pose { Name = "Ah" };

还有很多其他信息指定了pose / Exercise,但它与问题无关。

查看 - Exercise.cs

<%using(Html.BeginForm()){ %>
<div>
    <table>
        <thead>
            <tr>
                <th>Available</th>
                <th>
                </th>
                <th>Selected</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td valign="top">
                    <%=Html.ListBoxFor(model => model.AvailableExercises,
                    new MultiSelectList(Model.AvailableExercises, "RegimeItemID",
                    "Name", Model.AvailableSelected))%>
                </td>
                <td valign="top">
                    <input type="submit" name="add"
                           id="add" value=">>" /><br />
                    <input type="submit" name="remove"
                           id="remove" value="<<" />
                </td>
                <td valign="top">
                    <%=Html.ListBoxFor(model => model.RequestedSelected,
                    new MultiSelectList(Model.RequestedExercises, "RegimeItemID",
                    "Name", Model.RequestedSelected))%>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <%=Html.HiddenFor(model=>model.SavedRequested) %>
</div>
<%} %>

我要做的是允许专门为每个用户分配练习。这些练习已经播种了。当这种方法正常工作时,它应该允许以降序访问练习。

更新

根据斯蒂芬斯的建议,我得到的代码至少不会抛出任何错误。

然而,这是我现在在练习页面上收到的图片。 enter image description here

更新2

根据Stephen的帮助,我对下面的 Excercise.cshtml 视图进行了更改。

@model FaceToFaceWebsite.Models.UserExerciseViewModel

@using (Html.BeginForm())
{ 
        <div>
            <table>
                <thead>
                    <tr>
                        <th>Available</th>
                        <th>
                        </th>
                        <th>Selected</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td valign="top">
                            @Html.ListBoxFor(model => model.AvailableExercises, new MultiSelectList(Model.AvailableExercises, "RegimeItemID", "RegimeExercise", Model.AvailableSelected))
                        </td>
                        <td valign="top">
                            <input type="submit" name="add"
                                   id="add" value=">>" /><br />
                            <input type="submit" name="remove"
                                   id="remove" value="<<" />
                        </td>
                        <td valign="top">
                            @Html.ListBoxFor(model => model.RequestedSelected, new MultiSelectList(Model.RequestedExercises, "RegimeItemID", "RegimeExercise", Model.RequestedSelected))
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            @Html.HiddenFor(model => model.SavedRequested)
        </div>
}

我现在将其作为下面图片中显示的列表框。

enter image description here

我不确定这个问题是否存在于site.css中,但是它更有可能找不到播种的练习。

1 个答案:

答案 0 :(得分:0)

根据Stephens的帮助,我能够让它工作,另一方面,似乎我正在使用其中一个模型错误.Stephen提供的信息让我没有错误的构建,无论我的失败在我发布问题之前。最后一个问题不是在评论中提到的css,它可能是,但之前的问题是我需要使用多个模型来进行练习。

这是viewmodel。

namespace FaceToFaceWebsite.Models

    {
        public class UserExerciseViewModel
        {
            public List<RegimeItem> AvailableExercises { get; set; }
            public List<RegimeItem> RequestedExercises { get; set; }

            public int[] AvailableSelected { get; set; }
            public int[] RequestedSelected { get; set; }
            public string SavedRequested { get; set; }

        }
    }

Controller.cs

    //GET
    [HttpGet]
    public ActionResult Exercise(int? id)
    {
        User user = db.Users.Find(id);
        UserExerciseViewModel model = new UserExerciseViewModel { AvailableExercises = GetAllExercises(), RequestedExercises = new List<RegimeItem>() };
        return View(model);
    }

    //Post
    [HttpPost]
    public ActionResult Index(UserExerciseViewModel model, string add, string remove, string send, int id)
    {
        User user = db.Users.Find(id);
        //ModelState.Clear();
        RestoreSavedState(model);
        if (!string.IsNullOrEmpty(add))
            AddExercises(model);
        else if (!string.IsNullOrEmpty(remove))

        SaveState(model);
        return View(model);
    }

    void SaveState(UserExerciseViewModel model)
    {

        model.SavedRequested = string.Join(",", model.RequestedExercises.Select(p => p.RegimeItemID.ToString()).ToArray());


        model.AvailableExercises = GetAllExercises().Except(model.RequestedExercises).ToList();
    }

    void RemoveExercises(UserExerciseViewModel model)
    {
        if (model.RequestedSelected != null)
        {
            model.RequestedExercises.RemoveAll(p => model.RequestedSelected.Contains(p.RegimeItemID));
            model.RequestedSelected = null;
        }
    }

    void AddExercises(UserExerciseViewModel model)
    {
        if (model.AvailableSelected != null)
        {
            var prods = GetAllExercises().Where(p => model.AvailableSelected.Contains(p.RegimeItemID));
            model.RequestedExercises.AddRange(prods);
            model.AvailableSelected = null;
        }
    }

    void RestoreSavedState(UserExerciseViewModel model)
    {
        model.RequestedExercises = new List<RegimeItem>();

        //get the previously stored items
        if (!string.IsNullOrEmpty(model.SavedRequested))
        {
            string[] prodids = model.SavedRequested.Split(',');
            var prods = GetAllExercises().Where(p => prodids.Contains(p.RegimeItemID.ToString()));
            model.RequestedExercises.AddRange(prods);
        }
    }

    public ViewResult Done()
    {
        return View();
    }

    private List<RegimeItem> GetAllExercises()
    {
        return db.RegimeItems.ToList();
    }

和视图。

@model FaceToFaceWebsite.Models.UserExerciseViewModel

@using (Html.BeginForm())
{ 
        <div>
            <table>
                <thead>
                    <tr>
                        <th>Available</th>
                        <th>
                        </th>
                        <th>Selected</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td valign="top">
                            @Html.ListBoxFor(model => model.AvailableExercises, new MultiSelectList(Model.AvailableExercises, "RegimeItemID", "RegimeExercise", Model.AvailableSelected))
                        </td>
                        <td valign="top">
                            <input type="submit" name="add"
                                   id="add" value=">>" /><br />
                            <input type="submit" name="remove"
                                   id="remove" value="<<" />
                        </td>
                        <td valign="top">
                            @Html.ListBoxFor(model => model.RequestedSelected, new MultiSelectList(Model.RequestedExercises, "RegimeItemID", "RegimeExercise", Model.RequestedSelected))
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            @Html.HiddenFor(model => model.SavedRequested)
        </div>
}