Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过ajax渲染局部视图_C#_Ajax_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

C# 通过ajax渲染局部视图

C# 通过ajax渲染局部视图,c#,ajax,asp.net-mvc,asp.net-mvc-4,razor,C#,Ajax,Asp.net Mvc,Asp.net Mvc 4,Razor,我有一个仪表板视图。在此仪表板中,我要渲染多个局部视图。我开始这个练习只是为了学习。事实上,我不确定我做错了什么。这是我的密码: 我的仪表板控制器: public ActionResult DashboardIndex() { return View(); } public ActionResult DebitAndCreditExpensesPV() { DashboardMode

我有一个仪表板视图。在此仪表板中,我要渲染多个局部视图。我开始这个练习只是为了学习。事实上,我不确定我做错了什么。这是我的密码:

我的仪表板控制器:

public ActionResult DashboardIndex()
        {
            return View();
        }

        public ActionResult DebitAndCreditExpensesPV()
        {
            DashboardModel objGet = new DashboardModel();
            DashboardViewModel objVM = new DashboardViewModel();
            DateTime date = new DateTime();
            objVM.StartDate = new DateTime(date.Year, date.Month, 1);
            objVM.EndDate = objVM.StartDate.AddMonths(1).AddDays(-1);
            objVM.ExpenseType = objGet.GetExpensesByDebitAndCredit(objVM.StartDate, objVM.EndDate);
            return PartialView(objVM);
        }
My DashboardIndex.cshtml

@model GPI.ViewModel.DashboardViewModel
@{
    ViewBag.Title = "DashboardIndex";
}


<div class="container">
    <div class="row">
        <div class="col-md-12">
            <div class="col-md-4">
                   @{
                       Html.RenderPartial("DebitAndCreditExpensesPV");
               }
            </div>
            <div class="col-md-8"></div>
        </div>
    </div>
</div>

<script>
    $(document).ready(function () {

        $.ajax({

            type: "get",
            url: "/Dashboard/DebitAndCreditExpensesPV",
            data: {
                'startDate': $('#StartDate').val(),
                'endDate': $('#EndDate').val()
            },
            dataType: 'json',
            success: function () {
                alert('success');
            },
            error: function () {
                alert('failure');
            }
        });
    });
</script>
我的部分视图:DebitAndCreditExpensesPV.cshtml

@model GPI.ViewModel.DashboardViewModel
<div class="row">
    <div class="col-sm-4 col-md-12">
        <div class="stat-panel">
            <div class="stat-row">
                <div class="stat-cell bg-pa-purple padding-sm">
                    <div class="col-xs-6">
                        <div class="text-xs" style="margin-bottom:5px;">
                            Debit EXPENSES
                        </div>
                        <div style="width:100%;display:inline-block;margin-bottom:-2px;position:relative;">
                            <span class="text-xlg">
                                <span class="text-lg text-slim">&#8377;</span>
                                <strong>@Model.ExpenseType.TotalDebits</strong>
                            </span>
                        </div>
                    </div>
                    <div class="col-xs-6">
                        <div class="text-xs" style="margin-bottom:5px;">
                            Credit EXPENSES
                        </div>
                        <div style="width:100%;display:inline-block;margin-bottom:-2px;position:relative;">
                            <span class="text-xlg">
                                <span class="text-lg text-slim">&#8377;</span>
                                <strong>@Model.ExpenseType.TotalCredits</strong>
                            </span>
                        </div>
                    </div>

                </div>
            </div>
            <div class="stat-row">
                <div class="stat-counters bordered no-border-t text-center">
                    <div class="stat-cell col-xs-12 padding-sm">
                        <div class="input-daterange input-group" id="datepicker">
                            @Html.TextBoxFor(m => m.StartDate,"{0:d}", new { @class = "input-sm form-control" })
                            <span class="input-group-addon">to</span>
                            @Html.TextBoxFor(m => m.EndDate, "{0:d}", new { @class = "input-sm form-control" })
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@model GPI.ViewModel.DashboardViewModel
借方费用
₹
@Model.ExpenseType.totaldebitis
信贷费用
₹
@Model.ExpenseType.TotalCredits
@TextBoxFor(m=>m.StartDate,“{0:d}”,新的{@class=“input sm form control”})
到
@TextBoxFor(m=>m.EndDate,“{0:d}”,新的{@class=“input sm form control”})
我在控制器中设置了两个断点:一个位于“DashboardIndex”操作,另一个位于“DebiandCreditExpenseSPV”。第一个执行,但后面一个不执行。在第一个断点之后,我在我的局部视图中的这一行
@Model.ExpenseType.totaldebitis
中得到了“object null reference”异常


我想知道为什么第二个断点没有执行。如果执行此断点,则无法获得此异常。请告诉我哪里出错。

RenderPartial
方法中,您正在调用
debiandCreditExpenseSPV
部分视图。此视图被强类型化到您的
仪表板视图模型
,并且您在视图中使用了此模型的不同属性(例如:
Model.ExpenseType.totaldebitis

但是在索引视图中,没有将任何模型对象传递给
RenderPartial
方法。如果在此方法中未传递任何对象,它将尝试使用父视图(索引)的模型。在本例中,索引视图没有任何模型,因此局部视图现在拥有的模型本质上是NULL。您正试图访问NULL的
ExpenseType
属性,这就是您获得异常的原因

即使您修改了索引视图以通过模型,您也要做两次。一次是通过
RenderPartial
,另一次是在
document ready
事件上通过ajax调用
debiandecreditexpensespv
方法。也许你可以摆脱
RenderPartial
调用

因此,在索引视图中,添加一个div来显示ajax调用的结果

<div id="divDebitAndCredit"></div>
现在在上面的代码中,您正试图将startDate和endDate发送到action方法。因此,更新您的操作方法以接受这些

public ActionResult DebitAndCreditExpensesPV(DateTime? startDate,DateTime? endDate)
{          
    DashboardViewModel objVM = new DashboardViewModel();
    DateTime date = DateTime.Now; 
    if(startDate!=null)
    {
        objVM.StartDate = startDate.Value;
    }
    else
    {
        objVM.StartDate = new DateTime(date.Year, date.Month, 1);
    }
    if(endDate!=null)
    {
        objVM.EndDate = endDate.Value;
    }
    else
    {
        objVM.EndDate = objVM.StartDate.AddMonths(1).AddDays(-1);
    }       
        objVM.ExpenseType = new ExpenseList { TotalCredits = 45.00, TotalDebits = 634.00 };
    return PartialView(objVM);
}
但是
startDate
endDate
输入字段是局部视图的一部分。因此,当您在index视图的ready事件中调用ajax时,这些字段将不会成为页面的一部分。您可以将局部视图保留在div中,并将DashboardViewModel对象传递给局部视图

@model DashboardViewModel
<div id="divDebitAndCredit">
    @{ Html.RenderPartial("DebitAndCreditExpensesPV",Model) }
</div>

由于未将模型传递给分部,因此会出现null引用异常。(模型为
null
因此
Model.ExpenseType
作为例外抛出请注意
Html.RenderPartial()
不调用控制器方法(为此,您需要
Html.RenderAction()
)您的ajax调用将导致500个内部服务器错误,因为该方法返回一个视图,但您将返回类型指定为
dataType:'json',
@StephenMuecke,所以我应该如何将模型传递给partial,而ajax中的dataType将是
html
?至少您需要
public ActionResult DashboardIndex(){var model=new DashboardViewModel();return View(model);}
-始终将视图返回到模型。但是
DashboardIndex
还应具有初始化
ExpenseType
-
public DashboardIndex(){ExpenseType=new ExpenseList();}
(否则,您还必须在GET方法中初始化属性
ExpenseType
,是的,日期类型必须是
“html”
。您也将数据传递给方法(开始日期
和结束日期
的值),但您的方法没有任何参数,因此无法确定要执行的操作。
public ActionResult DebitAndCreditExpensesPV(DateTime? startDate,DateTime? endDate)
{          
    DashboardViewModel objVM = new DashboardViewModel();
    DateTime date = DateTime.Now; 
    if(startDate!=null)
    {
        objVM.StartDate = startDate.Value;
    }
    else
    {
        objVM.StartDate = new DateTime(date.Year, date.Month, 1);
    }
    if(endDate!=null)
    {
        objVM.EndDate = endDate.Value;
    }
    else
    {
        objVM.EndDate = objVM.StartDate.AddMonths(1).AddDays(-1);
    }       
        objVM.ExpenseType = new ExpenseList { TotalCredits = 45.00, TotalDebits = 634.00 };
    return PartialView(objVM);
}
@model DashboardViewModel
<div id="divDebitAndCredit">
    @{ Html.RenderPartial("DebitAndCreditExpensesPV",Model) }
</div>
public ActionResult Index()
{
    var objVM = new DashboardViewModel();
    DateTime date = DateTime.Now;
    objVM.StartDate = new DateTime(date.Year, date.Month, 1);
    objVM.EndDate = objVM.StartDate.AddMonths(1).AddDays(-1);
    objVM.ExpenseType = new ExpenseList { TotalCredits = 45.00, TotalDebits = 634.00 };

    return View(objVM);
}