2014-11-27 3 views
0

У меня есть представление, которое имеет флажки, позволяющие администратору удалить возможность пользователя загружать данный файл. Я хочу изменить базовое пользовательское свойство CanDownloadA/CanDownloadB, когда администратор изменит этот флажок. На мой взглядИмя метода динамического контроллера в Java Script MVC

<table class="table"> 
    <tr> 
     <th>Username</th> 
     <th>Email Addres</th> 
     <th>UserCost Access</th> 
     <th>DrGroup Access</th> 
     <th>Last Login</th> 
    </tr> 
    @{ 
     if (Model != null) 
     { 
      foreach (var item in Model.UserList) 
      { 
       <tr> 
        <td>@Html.DisplayFor(modelItem => item.UserName)</td> 
        <td>@Html.DisplayFor(modelItem => item.EmailAddress)</td> 
        <td>@Html.CheckBoxFor(modelItem => item.CanDownloadA.Value, 
         new { data_item = item.UserName, action = "EditAAccess"})</td> 
        <td>@Html.CheckBoxFor(modelItem => item.CanDownloadB.Value, 
         new { data_item = item.UserName, action = "EditBAccess" })</td> 
        <td>@Html.DisplayFor(modelItem => item.LastLoginDateTime)</td> 
        <td> 
         @Ajax.ActionLink(
          "Remove", 
          "UpdateUserInfo", 
          "Tools", 
          new 
          { 
           userName = item.UserName 
          }, 
          new AjaxOptions 
          { 
           HttpMethod = "GET" 
          }, 
          new { onclick = "return confirm('Are you sure you wish to delete user?');" }) 
        </td> 
       </tr> 
      } 
     } 
    } 
</table> 
... 
<script> 
    $(function() { 
     $("input[type=checkbox]").click(function() { 
      var data_item = $(this).data("userName"); 
      $.ajax({ 
       url: 'Tools/' + $(this).data("action"), 
       type: 'POST', 
       data: { userName: data_item, isChecked: $(this).is(':checked') }, 
       success: function (result) { 

       } 
      }); 
     }); 
    }); 
</script> 

Где скрипт вызова соответствующего метода контроллера, либо

[HttpPost] 
[AllowAnonymous] 
public async Task<ActionResult> EditUserCostAccess(
    string userName, bool isChecked) 
{ 
    return await EditAccess(userName, isChecked, DownloadType.UserCost); 
} 

или

[HttpPost] 
[AllowAnonymous] 
public async Task<ActionResult> EditDrGrouptAccess(
    string userName, bool isChecked) 
{ 
    return await EditAccess(userName, isChecked, DownloadType.DrGroup); 
} 

если удалить action = "EditBAccess" из флажком HtmlParameters и написать

url: 'Tools/EditDrGrouptAccess', 

в сценарии JQuery запускается соответствующий метод. Тем не менее, я не хочу иметь два сценария для запуска каждого метода, поэтому я написал url: 'Tools/' + $(this).data("action"),, который не работает.

  1. Почему моя функция JavaScript (в частности url: 'Tools/' + $(this).data("action"),) не работает?
  2. userName имеет значение null при передаче контроллеру, почему?

Спасибо за ваше время.


Редактировать. Задача 2 была решена @Samuel Caillerie ниже. Но 1. нет. Я изменил сценарий

<script> 
    $(function() { 
     $("input[type=checkbox]").click(function() { 
      var data_item = $(this).data("item"); 
      var data_action = $(this).data("action"); 
      $.ajax({ 
       url: 'Tools/' + data_action, 
       type: 'POST', 
       data: { userName: data_item, isChecked: $(this).is(':checked') }, 
       success: function (result) { 

       } 
      }); 
     }); 
    }); 
</script> 

и код CheckBox:

<td>@Html.CheckBoxFor(modelItem => item.CanDownloadUserCost.Value, 
    new { data_item = item.UserName, data_action = "EditUserCostAccess"})</td> 

Но это не работает.

ответ

2

Для вашего первого вопроса, я думаю, что это просто ошибка в коде:

<td>@Html.CheckBoxFor(modelItem => item.CanDownloadA.Value, 
     new { data_item = item.UserName, data_action = "EditAAccess"})</td> 
<td>@Html.CheckBoxFor(modelItem => item.CanDownloadB.Value, 
     new { data_item = item.UserName, data_action = "EditBAccess" })</td> 

(вы должны поставить data_action вместо action).

Для вашего второго пункта, изменить userName к item в ваших ЯШ:

var data_item = $(this).data("item"); 

или изменить имя атрибута, переданного флажке data_userName ...

+0

Это решило 1, но создание URL-адреса не работает. Любые идеи почему? – MoonKnight

+0

@ Killercam Я не понимаю: создание URL-адреса было вашим 1-м пунктом, нет? –

+0

Простите, да, вторая точка решена, первая - нет. Я отредактирую вопрос ... – MoonKnight