0

我的 ASP.net MVC 应用程序包含一个 DevExpress DateEdit 扩展,我可以选择日期(http://mvc.devexpress.com/Editors/DateEdit),现在我喜欢发送,每次用户更改日期时,通过对我的 DateEdit 扩展的处理程序做出反应,将日期返回给控制器。

我在javascript函数上设置了ClientSideEvents.DateChanged,现在我的问题开始了,通常我用表单发送数据并提交回控制器,并且活页夹将它们绑定到我的模型......

但现在我想在 javascript 函数中调用我的控制器上的一个方法,如 writeDate(DateTime date),ActionLink 可能会解决问题,因为我知道可以通过“\myController\”之类的链接调用控制器方法\参数”,但我不知道如何在没有用户操作的情况下实现这一点。

我的代码:

@Html.DevExpress().DateEdit(settings =>
                    {
                        settings.Name = "Date";
                        settings.Properties.UseMaskBehavior = true;
                        settings.Properties.EditFormat = EditFormat.Custom;
                        settings.Properties.EditFormatString = "MMMM dd, yyyy";
                        settings.Properties.DisplayFormatString = "MMMM dd, yyyy";
                        settings.Date = DateTime.Now;
                        settings.Properties.ClientSideEvents.DateChanged = "OnDateChanged";
                    }).GetHtml()
                @Html.DevExpress().Button(settings => {
                    settings.Name = "sendDate";
                    settings.ClientVisible = false;
                    settings.UseSubmitBehavior = true;
                });

function OnDateChanged(s, e) {
    // Call Controller
}

[HttpPost, ValidateInput(false)]
    public ActionResult onDateChanged(DateTime date)
    {
        // Do something
    }

所以我认为我的一般问题是如何在没有表单的情况下仅通过对客户端事件做出反应将数据传递给控制器​​?:)

4

2 回答 2

0

如果 devexpress 可以作为客户端事件的结果调用 js 函数,那么您可以这样做:

function OnDateChanged(s, e) {
    $.ajax({
        url: '@Url.Action("onDateChanged","Controller_Name")',
        type: 'POST',
        // e here depends on how devexpress pass the value
        // e.Value? or e.val(), just replace it accordingly
        data: { date: e }
    });
}
于 2013-05-07T13:42:56.477 回答
0

这样做的正确方法是使用 devexpress 的 CallbackPanel 扩展,将 DateTime 扩展添加到它的内容中,将面板的 CallBackRouteValues 设置为控制器,对 DateTime-Extension 的 ClientSideEvent 做出反应并在那里触发回调到服务器。

看法

    <script type="text/javascript">    
    var date = null;
    function OnDateChanged(s, e) {
        date = Datum.GetValue();
        if (!CBPDateEdit.InCallback()) {
            CBPDateEdit.PerformCallback();
        }
    }

    function OnBeginCallback(s, e) {
        e.customArgs["newDate"] = Date.GetValue().toString();
    }
    </script>
@Html.DevExpress().CallbackPanel(settings =>
{
settings.Name = "CBPDateEdit";
settings.CallbackRouteValues = new { Controller = "Controller", Action = "onDateChanged" };

settings.SetContent(() =>
{
    ViewContext.Writer.Write("content");
    Html.DevExpress().DateEdit(DateSettings =>
                    {
                        DateSettings.Name = "Date";
                        DateSettings.Properties.UseMaskBehavior = true;
                        DateSettings.Properties.EditFormat = EditFormat.Custom;
                        DateSettings.Properties.EditFormatString = "MMMM dd, yyyy";
                        DateSettings.Properties.DisplayFormatString = "MMMM dd, yyyy";
                        DateSettings.Properties.EnableClientSideAPI = true;
                        DateSettings.Date = DateTime.Now;
                        DateSettings.Properties.ClientSideEvents.DateChanged = "OnDateChanged";
                    }).GetHtml();
});

settings.ClientSideEvents.BeginCallback = "OnBeginCallback";
}).GetHtml()

控制器

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult onDateChanged(String newDate)
    {

        viewModel.date= DateTime.ParseExact(newDate, "ddd MMM d HH:mm:ss UTCzzzzz yyyy", CultureInfo.InvariantCulture);

        return PartialView("_CBPDateEditPartial");
    }
于 2013-05-14T13:29:38.090 回答