ASP MVC — проблема с шаблонами редактора (всегда отправляет данные только из первого шаблона)

У меня есть форма/представление, представляющее строго типизированную модель, содержащую простые свойства и свойство IEnumerable. Я использую шаблон редактора для свойства IEnumerable моей модели.

for (int i = 0; i < @Model.Items.Count(); i++)
                    {
                        @Html.EditorFor(model => @Model.Items[i])
                    }

Теперь шаблон выглядит следующим образом:

 @using (Html.BeginCollectionItem("Items"))
{
            <table style="width: 100%">
                <tr>      
                <td>
                    @Html.TextBoxFor(model => @Model.ID, new {id = "ID" })
                </td>
                <td>
                    @Html.TextBoxFor(model => @Model.Description, readonly="readonly", new {id = "Description" })
                </td>
                <tr />
                         <a role="button" id=getDescBtn>
                    </a>
            </table>
}

И сценарий моего шаблона:

<script type="text/javascript">

$(document).ready(function() {
    $("#getDescBtn").on('click', function (event) {
        $.ajax({
            url: '@Url.Action("LoadDescription")',
            async: false,
            cache: false,
            data: {id: $("#ID").val()}
    }).success(function (partialView) {

        });
    });
});

Now, My controller action looks like:

public ActionResult LoadDescription(string id)
    {}

Теперь предположим, что у меня есть два шаблона: в первом текстовое поле идентификатора содержит значение «1». Во втором текстовом поле идентификатора содержится значение «2».

Когда я нажимаю кнопку в первом шаблоне, я дважды получаю действие контроллера, оба со значением «1» (из первого шаблона). Когда я нажимаю кнопку во втором шаблоне, я попадаю в действие контроллера один раз, со значением "1" (из первого шаблона, хотя я нажимал кнопку второго шаблона).

Теперь то, чего я пытаюсь добиться, логически довольно просто: нажмите кнопку в первом шаблоне, один раз перейдите к действию контроллера со значением «1».

нажмите кнопку во втором шаблоне, один раз перейдите к действию контроллера со значением «2».

Кроме того, действие в контроллере отвечает за вычисление значения для описания, а затем заполнение поля описания. Что должен возвращать метод действия (я не думаю, что мне следует выполнять публикацию для всей формы) и как мне получить это в функции успеха при использовании Ajax? Спасибо за любую помощь.


person DimaK    schedule 22.06.2015    source источник
comment
Вы создаете недопустимый HTML-код из-за повторяющихся атрибутов id. Удалите new {id = "ID" } и new {id = "Description" } из помощников (помощники сгенерируют для вас правильные атрибуты id) и удалите id=getDescBtn из кнопки и используйте имя класса.   -  person    schedule 23.06.2015
comment
@StephenMuecke, спасибо, основная проблема исправлена. Можете ли вы просто увидеть мой комментарий к ответу Шермина?   -  person DimaK    schedule 23.06.2015
comment
Ваш скрипт должен быть в главном представлении. Сценарий никогда не должен находиться в частичном   -  person    schedule 24.06.2015


Ответы (1)


Я думаю, вам нужно использовать классы для ваших кнопок и редакторов вместо идентификаторов. В вашем коде у вас есть несколько текстовых полей с Id=ID и несколько кнопок с id=getDescBtn. Таким образом, $("#ID").val() просто даст вам значение первого элемента с id="ID", который является вашим первым текстовым полем.

Что касается обновления описания, вы можете заставить свое действие вернуть значение описания, а затем установить текстовое поле описания при успешном вызове ajax.

@using (Html.BeginCollectionItem("Items"))
{
        <table style="width: 100%">
            <tr>      
            <td>
                @Html.TextBoxFor(model => @Model.ID, new {@class = "ID" })
            </td>
            <td>
                @Html.TextBoxFor(model => @Model.Description, readonly="readonly", new {@class = "Description" })
            </td>
            <tr />
                     <a role="button" class="getDescBtn">
                </a>
        </table>
}
<script type="text/javascript">

$(document).ready(function() {
$(".getDescBtn").on('click', function (event) {
    $.ajax({
        url: '@Url.Action("LoadDescription")',
        async: false,
        cache: false,
        data: {id: $(this).parent().find(".ID").val()}
     })
    .success(function (data) {
     $(this).parent().find(".Description").val(data.description )
    });
});
});

public JsonResult LoadDescription(string id)
{
//your logic here
return Json(new {description )});
}   
person Shermin    schedule 22.06.2015
comment
Спасибо за объяснение. Проголосовал :) Теперь это работает хорошо, но предположим, что у меня есть 3 таких шаблона: щелчок по кнопке в первом шаблоне приводит к контроллеру с правильным значением 1, но он переходит к действию 3 раза. щелчок по кнопке во втором шаблоне приводит к контроллеру с правильным значением 2 , но он дважды переходит к действию. нажатие на кнопку в третьем шаблоне приводит к контроллеру с правильным значением 3 (здесь он получает контроллер только один раз). Любые предложения, пожалуйста? - person DimaK; 23.06.2015
comment
Является ли ваш $(.getDescBtn).on('click') частью вашего шаблона редактора или частью вашего основного вида? Потому что, если это часть шаблона редактора, то он повторяется три раза на вашей странице, поэтому имеет смысл, если он делает три вызова. - person Shermin; 23.06.2015