Только последний элемент управления переключателем в списке установлен как отмеченный

#asp.net #asp.net-mvc #radio-button

#asp.net #asp.net-mvc #переключатель

Вопрос:

У меня есть список, в котором каждый элемент списка содержит элемент управления звездным рейтингом, который позволяет пользователю устанавливать свои предпочтения для этого элемента. Элемент управления рейтингом — это, по сути, всего 5 переключателей. Проблема, с которой я сталкиваюсь, заключается в том, что когда я извлекаю настройки, ранее сделанные пользователем, отображается только последнее предпочтение, переключатели для всех элементов до этого не отмечены.

Вот как это выглядит, показывая 4 звезды для последнего элемента, однако он также должен показывать одну для первого и три звезды для второго:

введите описание изображения здесь

Это код для представления:

 @foreach (var item in Model.TaskEntities)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Code)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AspNetUser.Forename)
            @Html.DisplayFor(modelItem => item.AspNetUser.Surname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AspNetUser.Email)
        </td>
        <td>
            @{
                var list = new TaskEntityAndPreferencesModel(item, Model.Preferences);
            }
            @Html.Partial("_Rating", list)
        </td>
        <td>
            @*@Html.ActionLink("Edit", "Edit", new { id = item.CourseID }) |
                @Html.ActionLink("Details", "Details", new { id = item.CourseID }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.CourseID })*@
        </td>
    </tr>
<tr>

    <td colspan="5">
        @Html.DisplayFor(modelItem => item.Description)
    </td>
</tr>
}
  

Это код для элемента управления рейтингом (_Rating):

 @using Microsoft.AspNet.Identity
@model AssignerWebTool.Models.TaskEntityAndPreferencesModel

@{
var checkedOne = false;
var checkedTwo = false;
var checkedThree = false;
var checkedFour = false;
var checkedFive = false;


foreach (var preference in Model.Preferences)
{
    if (preference.UserID == User.Identity.GetUserId() amp;amp; preference.TaskEntityID == Model.Task.ID)
    {
        if (preference.Rating == 1)
        {
            checkedOne = true;
        }
        else if (preference.Rating == 2)
        {
            checkedTwo = true;
        }
        else if (preference.Rating == 3)
        {
            checkedThree = true;
        }
        else if (preference.Rating == 4)
        {
            checkedFour = true;
        }
        else if (preference.Rating == 5)
        {
            checkedFive = true;
        }
    }
}
}
<div class="ratting-item" data-pid="@Model.Task.ID">
@{
    if (checkedOne)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="1"/>
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="1" />
    }
    if (checkedTwo)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="2" />
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="2" />
    }
    if (checkedThree)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="3" />
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="3" />
    }
    if (checkedFour)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="4" />
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="4" />
    }
    if (checkedFive)
    {
        <input class="rating" name="vote" type="radio" checked="checked" value="5" />
    }
    else
    {
        <input class="rating" name="vote" type="radio" value="5" />
    }
}

</div>
<span class="result"></span>
  

Я не уверен, почему это работает только для последнего элемента, а не для любого предыдущего, поэтому буду признателен за любую помощь.

Редактировать:

Модели:

 public class TaskEntityAndPreferencesModel
{

    public TaskEntity Task { get; set; }
    public IEnumerable<UserTaskEntityPreference> Preferences { get; set; }

    public TaskEntityAndPreferencesModel(TaskEntity task, IEnumerable<UserTaskEntityPreference> preferences)
    {
        Task = task;
        Preferences = preferences;
    }
}


public partial class TaskEntity
{
    public TaskEntity()
    {
        this.UserAssignedToTaskEntities = new HashSet<UserAssignedToTaskEntity>();
        this.UsersUserPreferences = new HashSet<UsersUserPreference>();
        this.UserTaskEntityPreferences = new HashSet<UserTaskEntityPreference>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
    public string RelatedSubjects { get; set; }
    public int MaxNumberOfUsers { get; set; }
    public int TaskGroupID { get; set; }
    public string SupervisorID { get; set; }

    public virtual Task_Group Task_Group { get; set; }
    public virtual ICollection<UserAssignedToTaskEntity> UserAssignedToTaskEntities { get; set; }
    public virtual ICollection<UsersUserPreference> UsersUserPreferences { get; set; }
    public virtual ICollection<UserTaskEntityPreference> UserTaskEntityPreferences { get; set; }
    public virtual AspNetUser AspNetUser { get; set; }
}


public partial class UserTaskEntityPreference
{
    public string UserID { get; set; }
    public int TaskEntityID { get; set; }
    public int Rating { get; set; }
    public int ID { get; set; }

    public virtual AspNetUser AspNetUser { get; set; }
    public virtual TaskEntity TaskEntity { get; set; }
}
  

Комментарии:

1. Вся цель переключателей заключается в том, что вы можете выбрать только один для группы (и все ваши переключатели принадлежат к одной группе с именем vote ).

2. В любом случае весь этот код совершенно не нужен. Все, что вам нужно для for цикла или пользовательского EditorTemplate , например for(int i = 0; i < Model.Preferences.Count; i ) { @Html.RadioButtonFor(m => m.Preferences[i].Vote, 1) @Html.RadioButtonFor(m => m.Preferences[i].Vote, 1) // plus other 3 } , и все это будет сделано автоматически

3. Ах, я вижу, в этом есть смысл, вы мне очень помогли.

4. Я только что привел пример, но вам нужно показать свои модели, если вы хотите получить ответ, показывающий фактический код, который вам нужно использовать (который будет составлять примерно 1/10 от кода, который вы используете в настоящее время)

5. Модели добавлены по запросу

Ответ №1:

Причина, по которой выбран только последний переключатель, заключается в том, что все ваши переключатели имеют одинаковую name (группу), и вы можете выбрать только один переключатель из группы.

На 1-й итерации вашего цикла для этого value="1" выбран переключатель с Preference . На 2-й итерации выбран переключатель с value="3" , но поскольку может быть выбран только один переключатель, checked атрибут удаляется из предыдущего. Процесс продолжается для каждой итерации, и выбирается только переключатель, соответствующий последнему Preference .

Чтобы решить эту проблему, вам нужно присвоить каждой «группировке» отдельный name атрибут, чтобы 5 переключателей для 1-го Preference имели (скажем) name="vote1" , а для 2-го (скажем) name="vote2" и т.д.

Однако ни один из ваших javascript не нужен, если вы сначала просто правильно сгенерируете представление путем привязки к вашей модели, и в вашем случае вы должны использовать [view model] [1] (мне бы не хотелось видеть скрипты, которые вы должны использовать, чтобы преобразовать все это обратно в свою модель при публикации значений).