在模态框中打开相应的对话

时间:2011-04-25 10:48:56

标签: jquery asp.net-mvc asp.net-mvc-3 dialog razor

我正在使用Loading a partial view in jquery.dialog中解释的@Darin Dimitrov方法,允许用户点击其中一条私人消息并在模式框中查看。我使用ASP.NET MVC3和Razor作为我的视图引擎。但是我在使用这个工作时遇到了一些麻烦...以下是我到目前为止所做的尝试:

消息显示在表格中:

<tr id="@item.Id" class="openConversationLink">
    <td class="newMessageStatus">@MessageStatus(item)</td>
    <td class="msgSenderName">@item.Sender</td>
    <td class="msgSubject">@item.Subject</td>
    <td class="msgLastUpdated">@item.LastUpdated</td>
    <td class="modalItemActions"></td>
</tr> 

在同一局部视图中,我得到了以下脚本块:

<script type="text/javascript">
    $(function () {
        $("#conversationModal").dialog({
            autoOpen: false,
            width: 850,
            height: 600,
            resizable: false,
            draggable: false,
            modal: true,
            open: function (event, ui) {
                var convId = ui.attr('id');
                alert(convId);
                $(this).load('@Url.Action("Conversation", "Message", new { conversationId = convId})');

            }
        });

        $(".openConversationLink").click(function () {
            $("#conversationModal").dialog('open');
        });
    });
</script>

基本上,我不确定event处理程序中的uiopen参数是什么意思。因此,对两者的一点解释将不胜感激。但无论如何,即使消息现在也不显示,我仍然会收到这些错误:

  

编译器错误消息:CS0103:   名称“convId”不存在于   目前的背景。资源:   $(本).load('@ Url.Action( “对话”,   “消息”,新{conversationId =   convId})');

基本上,在我实际点击其中一行(打开对话对话框)之前,我不希望该行被触发,但是当消息页面打开时,它似乎实际上被触发了。

更新

现在是我的jQuery代码:

$(function () {
    $("#conversationModal").dialog({
        autoOpen: false,
        width: 850,
        height: 600,
        resizable: false,
        draggable: false,
        modal: true,
        open: function (event, ui) {
            var convId = event.target.attr('id');
            alert(convId);
            $(this).load('Message/Conversation/' + convId);

        }
    });

    $(".openConversationLink").click(function () {
        $("#conversationModal").dialog('open');
    });
});

有什么可以做的吗? :)

1 个答案:

答案 0 :(得分:1)

在继续之前,您需要了解关键问题&gt;

Url.Action()方法正在服务器端。无论传递给它,都必须在服务器端决定。在客户端Javascript中声明的任何变量都完全忽略了服务器端代码,因此编译器试图在服务器端代码中找到convId,显然无法找到它。所以它给出了错误。

现在说,我们需要找到一种方法将convId传递给服务器。为此,您需要在客户端进行一些手动字符串连接。你可以做这样的事情&gt;

'@Url.Action("Conversation", "Message")' + '?conversationId='+convId

您看到我们使用服务器端代码生成/Message/Conversation,然后在客户端连接它以使其/Message/Conversation/?conversationId=valueOfconvId

我希望它有道理:)

修改

<script type="text/javascript">
var clickedId;
   $(function () {
        $("#conversationModal").dialog({
            autoOpen: false,
            width: 850,
            height: 600,
            resizable: false,
            draggable: false,
            modal: true,
            open: function (event, ui) {

                $(this).load('Message/Conversation/' + clickedId);

            }
        });

        $(".openConversationLink").click(function () {
            clickedId = $(this).attr("id");
            $("#conversationModal").dialog('open');
        });
    });
</script>

现在有意义吗?我们将点击的tr的ID保存在全局变量