【问题标题】:C# MVC Controller passing null dateC# MVC 控制器传递空日期
【发布时间】:2016-02-20 08:57:36
【问题描述】:

我有一个 ASP.net MVC 应用程序。它使用引导导航栏在两个表单之间导航。我将日期从日期选择器传递给 C# 函数,但如果没有在日期选择器中输入日期,它在页面加载时不起作用。如果没有日期可以通过,我不确定如何补偿。如果日期选择器中没有日期,则应采用今天的日期。我没有收到错误消息,它只是不起作用。这是我的看法:

<div class="row-fluid 1">
    <div class="col-lg-12 delayed_spiff_body">

        <div class="row spiff-datepicksection">
            <div class="col-lg-6 pull-right">
                <div class="col-sm-5 col-lg-offset-4">
                    <div class="form-group">
                        <div class="input-group date">
                            <input type="text" id="startDate" class="form-control" />
                            <span class="input-group-addon">
                                <span class="glyphicon glyphicon-calendar"></span>
                            </span>
                        </div>
                    </div>
                </div>
                <div class="col-lg-3">
                    <input class="spiffdate-btn" type="button" value="Submit" />
                </div>
            </div>
        </div> 
<div class="row spiff_tabs_body">
            <!-- Nav tabs -->

            <ul class="nav nav-tabs spiff_tabs" role="tablist">
                <li role="presentation" class="active">
                    <a href="#home" aria-controls="home" role="tab" data-id="delayedspiff" data-toggle="tab" onclick="FormGet('dashboard/delayedspiff', 'delayedspiff')">Potential Spiff</a>
                </li>
                <li role="presentation">
                    <a href="#profile" aria-controls="profile" role="tab" data-id="instantspiff" data-toggle="tab" onclick="FormGet('dashboard/instantspiff', 'delayedspiff')">Instant Spiff</a>
                </li>
            </ul>
            <!-- Tab panes -->
            <div class="tab-content">
                <div role="tabpanel" class="tab-pane active" id="delayedspiff"></div>
                <div role="tabpanel" class="tab-pane" id="instantspiff"></div>
            </div>
        </div>
    </div>
</div>

<script>
    $(function () {
    FormGet('dashboard/delayedspiff', 'delayedspiff');
});
</script>

<script>
   $(".spiffdate-btn").click(function(){
   var correctId = $("ul.spiff_tabs li.active a").attr('data-id');
   console.log(correctId);

   var startDate = $("#startDate").val();
   if (startDate == "") {

   } else {
       if (correctId == "delayedspiff")
       {          
           $.get("@Url.Action("DelayedSpiff", "Dashboard")", { startDate: startDate });

       } else if (correctId = "instantspiff") {

           $.get("@Url.Action("InstantSpiffDate", "Dashboard")", { startDate: startDate });
       }    
   }         
});
</script>

这是我的控制器中的部分代码,应该将日期传递给它。

public ActionResult DelayedSpiff(DateTime startDate)
    {
        var available = _appService.GetFeatureStatus(1, "spiffDashboard");
        if (!available)
            return RedirectToAction("DatabaseDown", "Error", new { area = "" });

        //var startDate = DateTime.Today.AddDays(-6);

        if (startDate == DateTime.MinValue)
        {
            startDate = DateTime.Today.AddDays(-6);
        }
        else
        {
            startDate = startDate.AddDays(-7);
        }            

        var acctId = User.AccountID;

        var endDate = DateTime.Today.AddDays(1); // 1

        Dictionary<DateTime, List<SpiffSummaryModel>> dict = new Dictionary<DateTime,List<SpiffSummaryModel>>();

        try
        {
            var properties = new Dictionary<string, string>
            {
                { "Type", "DelayedSpiff" }
            };
            telemetry.TrackEvent("Dashboard", properties);

            dict = _reportingService.GetDailyDelayedSpiffSummaries(acctId, startDate, endDate); 

谁能告诉我我做错了什么?我猜它与 FormGet 函数有关。谢谢。

【问题讨论】:

    标签: jquery asp.net asp.net-mvc twitter-bootstrap datepicker


    【解决方案1】:

    你能在你的 Action 中让 startDate 为空吗?

    public ActionResult DelayedSpiff(DateTime? startDate)
    

    然后在你的代码中处理这个。

    if (!startDate.HasValue || startDate.Value == DateTime.MinValue)
        {
            startDate = DateTime.Today.AddDays(-6);
        }
        else
        {
            startDate = startDate.Value.AddDays(-7);
        }   
    

    然后你可以删除

    if (startDate == "") {
    
    } else {
    

    【讨论】:

    • 嗨 JamieD77。我在 startDate = startDate.AddDays(-7); 上遇到错误它说错误 13 'System.Nullable' 不包含 'AddDays' 的定义,并且没有扩展方法 'AddDays' 接受类型为 'System.Nullable' 的第一个参数(您是否缺少 using 指令或程序集引用?)
    • 您可以创建一个新变量或始终使用 startDate.Value.AddDays
    • 好的,但现在在这一行 dict = _reportingService.GetDailyDelayedSpiffSummaries(acctId, startDate, endDate);我收到错误消息 Error 22 Argument 2: cannot convert from 'System.DateTime?'到'System.DateTime'
    • 同样的事情.. 使用 startDate.Value
    • 我在发表评论后立即发现了这一点。 :) 它的工作!非常感谢!
    【解决方案2】:

    好吧,如果输入为空,那么您的代码显式什么都不做:

    var startDate = $("#startDate").val();
    if (startDate == "") {
    
    }
    

    如果您想调用服务器端操作而不考虑输入内容,那么只需完全删除该条件并执行当前位于 else 块中的逻辑。

    【讨论】:

    • 大卫,它仍然不起作用。如果我在 javascript 代码中取出这些行,它根本不会加载表单。
    • @hollyquinn:您能否再澄清一下这个问题。 “根本不加载表单”并不是真正的描述性。 会发生什么?具体来说,您想在这里做什么以及它到底在哪里失败了?
    • 当然。发生的情况是使用引导导航选项卡加载页面。根据您所在的选项卡,它会显示不同的表单。当表单加载 actionresult 时,DelayedSpiff 运行并用数据填充表。屏幕上有一个日期选择器,允许用户选择一个日期并显示该日期的一系列数据。如果日期选择器中没有日期,则应为今天的日期加载表单。我遇到的问题是,如果在表单加载时日期选择器中没有日期,它不会运行操作结果 DelayedSpiff。这更有意义吗?谢谢。
    • @hollyquinn:你在谈论这个函数调用吗?:FormGet('dashboard/delayedspiff', 'delayedspiff'); 你还没有展示FormGet() 是什么或做什么,所以我真的无能为力。 (如果它内置在您正在使用的某个框架中,我不熟悉它。)无论哪种方式,您都必须在此处至少进行 一些 调试。这里没有人可以为你做到这一点。什么客户端代码发出 AJAX 请求?请求是否提出?服务器的响应是什么?如果它没有被制造出来,是什么阻止了它被制造出来?
    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 2015-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多