jquery - 如何从单击按钮呈现的部分 View 将 recordId 传递给模型构造函数

标签 jquery asp.net-mvc razor

我有一个呈现记录列表的 View 。其中一列是 ID (SynchronizationID)。另一个项目是具有动态生成 ID 的按钮,其中包含与 ID 列连接的“btnUpdate”。它运行完美。

以下是将列表呈现为网格的 View 部分:

@foreach (var item in Model.PendingSynchronizations)
{
    <tr>
        <td>
            @item.SynchronizationID
        </td>
        <td>
            @item.CustomerName
        </td>
        <td>
            @item.ProductName
        </td>
        <td>
            @String.Format("{0:g}", item.LastProcessedDate)
        </td>
        <td>
            @item.OLAPServer
        </td>
        <td>
            @item.OLAPDatabase
        </td>
        <td>
            <input id="@String.Format("btnUpdate{0}",item.SynchronizationID.ToString())" type="submit" value="@String.Format("{0}", (item.ApprovedFlag) ? "Reject" : "Approve")" synchId="@item.SynchronizationID.ToString()"/>
        </td>
        <td>
            @item.ApprovedSynchDate
        </td>
    </tr>
}

我有一个 JQuery 选择器,它将按钮绑定(bind)到我的点击事件,效果非常好。点击事件以及处理接受和取消按钮的按钮事件如下:

function promptForSynchDate() {
    $('#approve-synch').dialog({
        modal: true,
        height: 300,
        width: 450,
        title: 'Approve Production Synchronization ',
        buttons:
        [
            { text: "Approve", click: approveSynch },
            { text: "Cancel", click: function () { $(this).dialog("close"); } }
        ]
    });
}


function approveSynch() {
    $('#approveSynchForm').submit();
}

function updateComplete() {
    alert('Production Synch Approved');
    window.location.reload();
}  

该模式呈现一个部分 View ,其中包含一个必填字段(日期),这也可以完美运行。但是,当我输入日期并单击 Accept 按钮时, Controller 将模型传递回构造函数,并填充了日期字段(它是通过在 Controller 的该日期字段上调用 ​​SET() 方法来实现的。但是 id 字段我更新需求始终为 0。

这是部分 View :

@model CubeBuilder.Site.Models.ProductionSynchDateModel
@using (Html.BeginForm("ToggleApprove", "Synchronization", new { id = Model.SynchronizationId }, FormMethod.Post))
{
    @Html.LabelFor(model => model.SynchronizationId);
    @Html.DisplayFor(model => model.SynchronizationId);
    @Html.LabelFor(model => model.SyncDate);
    @Html.TextBoxFor(model => model.SyncDate, new { @class = "datepicker" })        
}

<script type="text/javascript">
    $(document).ready(function () {
        $(".datepicker").datepicker();
    });
</script>

我实际上并不需要这种形式的 SynchronizationId。它仅用于调试目的。我只需要日期。但是当调用构造函数时,我还需要synchronizationId,以便我可以更新数据库中的这条记录。

以下是部分 View 的 Ajax 调用:

<div id="approve-synch">
@using (Ajax.BeginForm("ToggleApprove", "Synchronization", new AjaxOptions() { 
    OnFailure = "updateSynchFailed", 
    OnSuccess = "updateComplete", 
    InsertionMode = InsertionMode.Replace, 
    UpdateTargetId = "approve-synch-form" }, 
    new { id = "approveSynchForm" }))
{
<div id="approve-synch-form">
@Html.Partial("ApproveSynch", new CubeBuilder.Site.Models.ProductionSynchDateModel())
</div>
}
</div>

我已经尝试了我能想到的一切,并且很乐意承认,这可能只是因为我对 MVC 相当陌生,这阻碍了我。

任何帮助将不胜感激。

更新:

当我继续调试这个问题时,我在 View 上添加了一个隐藏字段,其中包含名为 CurrentSynchId 的记录列表,我在按钮单击事件中设置了该字段,如下所示:

$('#CurrentSynchId').val($(this).attr('synchId'));

然后,如果我将以下行添加到我的部分 View 中,我绝对不想要:

@Html.EditorFor(model => model.SynchronizationId);

最后,在我的提交按钮处理程序的模型中为它​​工作的模式中的提交按钮设置属性值:

    $('#SynchronizationId').val($('#CurrentSynchId').val());

这是部分 View 的模型,以防有帮助:

public class ProductionSynchDateModel
{
    public short SynchronizationId { get; set; }
    public Synchronization synchInstance { get; set; }
    private SynchronizationManager synchManager { get; set; } 

    public bool Approved
    {
        get;
        set;
    }

    [Required]
    [Display(Name = "Production Sync Date")]
    public DateTime? Schedule
    {
        get;
        set;
    }

    [Display(Name = "Production Sync Date")]
    public string SyncDate
    {
        get
        {
            if (Schedule.HasValue)
                return Schedule.Value.ToShortDateString();

            return string.Empty;
        }
        set
        {
            Schedule = Convert.ToDateTime(value);
        }
    }

    public ProductionSynchDateModel()
    {
    }

    public ProductionSynchDateModel(short id)
    {
        var db = EntityContext.New;
        SynchronizationId = id;

        synchManager = new SynchronizationManager(db);
        synchInstance = synchManager[SynchronizationId];
    }
}

再说一遍,任何帮助都会很棒。我觉得我只是偶然发现了一些在这里起作用的东西,但我不知道为什么。如果我从部分 View 中删除 EditorFor() 辅助函数调用,它将不起作用。

再次更新:没关系。我想通了并且明白为什么。我将 EditorFor() 帮助器更改为 HiddenFor(),这会导致字段从 View 推送到部分 View ,并持久保存在部分 View 的模型中。一切都很好。

我希望其他有同样问题的人可以从中获得一些内幕。它基本上是一种使用按钮和模式制作网格的方法,并且效果很好。

最佳答案

这对我有用

@Html.HiddenFor(model => model.SynchronizationId)

关于jquery - 如何从单击按钮呈现的部分 View 将 recordId 传递给模型构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347060/

相关文章:

asp.net-mvc - Razor 对引用的 html 属性进行编码

asp.net-mvc - Html Action 链接没有将我带到正确的页面

jquery - MVC Razor DatePicker 和 TimePicker

jquery - 脚本70 : Permission denied Accessing iFrame in IE

javascript - 过滤txt文件中的行并将其设为http href链接

asp.net - DataAnnotation [DataType(DataType.Date)] 使我的字段不必要地成为必填项

javascript - 如何从 foreach 循环创建动态 ID

javascript - 使用 ajax 调用显示加载栏时遇到问题

javascript - 突出显示 jQuery 中单词之间的空白

asp.net - 使用 ASP.NET MVC Controller 注入(inject)的好处?