0

次のEditorTemplateは、希望どおりに機能しません。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SHP.Models.BusinessUnitSelected>" %>

<tr>
    <td><%: Model.BusinessUnit.BusinessUnitName %></td>
    <td><%: Html.CheckBoxFor(model => model.Selected, 
        new { onclick = "SaveSelection(" + Model.EmployeeId + ", " + Model.BusinessUnit.BusinessUnitId + ", " + Convert.ToInt32(Model.Selected) + ", " + this.ClientID + ")" }) %>
    </td>
</tr>

チェックボックスのIDを取得したいのですが、this.ClientIDで取得できません。このEditorTemplateは、テーブル内に行のグリッドを形成します。チェックボックスをクリックすると、SaveSelectionjavascriptが実行されます。

    function SaveSelection(employeeId, businessUnitId, selectedFlag, elementId) {
        //var tempFlag = selectedFlag === "0";

        var element = document.getElementById(elementId);
        if (selectedFlag === null) {
            selectedFlag = true;
        } else {
            selectedFlag = !selectedFlag;
        }

        var url = '<%: Url.Action("AddBusinessUnitForEmployee", "DataService")%>';
        dataService.saveSelection(employeeId, businessUnitId, selectedFlag, elementId, SavedSetting, url);
    }

    SavedSetting = function(data) {
        $('#' + data.ElementId).after('<span class="error">' + data.Message + '</span>');
    };

私が欲しいのは、サーバー呼び出しの後にチェックボックスの横にメッセージを表示することです。では、どうすればこれを行うことができますか?Upticksは、このコードを改善する方法についてのアドバイスに対して授与されます。

4

1 に答える 1

2

HTML5data-*属性を使用できます。

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<SHP.Models.BusinessUnitSelected>" 
%>

<tr>
    <td><%: Model.BusinessUnit.BusinessUnitName %></td>
    <td>
        <%= Html.CheckBoxFor(
            x => x.Selected,
            new { 
                data_url = Url.Action("AddBusinessUnitForEmployee", "DataService"),
                data_employeeId = Model.EmployeeId,
                data_businessUnitId = Model.BusinessUnit.BusinessUnitId
            }
       ) %>
    </td>
</tr>

次に、別のjavascriptファイルで、これらのチェックボックスのイベントを目立たないようにサブスクライブし、属性.click()から必要な情報をフェッチします。data-*

$(function() {
    $('tr input[type="checkbox"]').click(function() {
        var elementId = $(this).attr('id');
        var url = $(this).data('url');
        var employeeId = $(this).data('employeeId');
        var businessUnitId = $(this).data('businessUnitId');
        var selectedFlag = !$(this).is(':checked');

        dataService.saveSelection(
            employeeId, 
            businessUnitId, 
            selectedFlag, 
            elementId, 
            SavedSetting, 
            url
        );
    });
});

備考:ASP.NET MVC 2が、生成されたマークアップの構文にdata_書き直すために構文をサポートしていたかどうかを正確に思い出せません。data-これは、ASP.NETMVC3以降で完全にサポートされています。それがうまくいかない場合は、RouteValueDictionary:を使用して別のオーバーロードを使用できます。

<%= Html.CheckBoxFor(
    x => x.Selected,
    new RouteValueDictionary
    {
        { "data-url", Url.Action("AddBusinessUnitForEmployee", "DataService") },
        { "data-employeeId", Model.EmployeeId },
        { "data-businessUnitId", Model.BusinessUnit.BusinessUnitId }
    }
) %>
于 2012-09-17T16:08:49.567 に答える