如何通过项目列表,从视图控制器(ASP.NET MVC 4) [英] How to Pass a List of Items from View to Controller (ASP.NET MVC 4)

查看:120
本文介绍了如何通过项目列表,从视图控制器(ASP.NET MVC 4)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图传递多个类型名单<项目> ,以我的控制器,但是,当我提出我的数据,它显示在我的控制器为空

我想发生这样的是,我有在视图'费'的列表,每个'费用'或项目旁边是从提交布尔在我的模型属性的复选框。当我检查的项目,我想检查的项目的属性的提交 DateSubmitted 在数据库中进行更新。

列表

@ Html.DisplayFor(modelItem => item.Submitted)在View产生复选框。

我在做什么错了?

下面是我的看法:

  @model IEnumerable的< Expenses.Models.Expense>@ {
ViewBag.Title =提交费用;
布局=〜/查看/共享/ _Layout.cshtml今天的DateTime = DateTime.Today;
字符串formattedDate = today.ToString(MM / DD / YYYY);
}<链接rel =stylesheet属性HREF =// code.jquery.com / UI / 1.11.4 /主题/平滑度/ jQuery的-ui.css>
<脚本的src =// code.jquery.com / jQuery的-1.10.2.js>< / SCRIPT>
<脚本的src =// code.jquery.com / UI / 1.11.4 / jQuery的-ui.js>< / SCRIPT>< H2>提交费用和LT; / H>@using(Html.BeginForm())
{
@ Html.AntiForgeryToken()
< D​​IV CLASS =形式的内联>
    < D​​IV CLASS =表单组>
        < H4>起始日期:< / H4>
        < D​​IV CLASS =COL-MD-10>
            @ Html.TextBox(expenseDate,formattedDate,htmlAttributes:新
           {
               @class =表格控
           })
        < / DIV>
    < / DIV>    < D​​IV CLASS =表单组>
        < H4>终止日期:< / H4>
        < D​​IV CLASS =COL-MD-10>
            @ Html.TextBox(expenseDate2,formattedDate,htmlAttributes:新
           {
               @class =表格控
           })
        < / DIV>
    < / DIV>    < D​​IV CLASS =表单组>
        @if(User.IsInRole(管理员))
        {
            < H4>用户名:​​其中; / H4>
            < D​​IV CLASS =主编场>
                @ Html.DropDownList(用户ID的String.Empty)
            < / DIV>
        }
    < / DIV>    < BR />
    < BR />    < D​​IV CLASS =表单组>
        < D​​IV CLASS =COL-MD-2>
            <输入类型=提交值=检索费级=BTN BTN-默认的/>
        < / DIV>
    < / DIV>< / DIV>< BR />
< BR />
&所述p为H.;
    @ Html.ActionLink(新建,创建)
&所述; / P>
<表样式=保证金底:20像素;>
    &所述; TR>
        <第i个
            @ Html.DisplayNameFor(型号=> model.Company)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.Category)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.Province)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.ReceiptName)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.Comment)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.GrossAmount)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.TaxAmount)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.NetAmount)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.Mileage)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.TravelStatus)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.LunchLearnStatus)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.WithClientStatus)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.DateEntered)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.DateSubmitted)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.ExpenseDate)
        < /第i
        <第i个
            @ Html.DisplayNameFor(型号=> model.ImageName)
        < /第i
        @if(User.IsInRole(管理员))
        {
            <第i个
                @ Html.DisplayNameFor(型号=> model.UserProfile.UserName)
            < /第i
        }
        百分位>< /第i
    < / TR>
    &所述; TR>
        &所述; TD>
            < B>所有选择:LT; / B>
            < BR />
            <输入类型=复选框NAME =费用值=费用ID =selectAllCheckboxes级=expenseCheck>
        < / TD>
    < / TR>
    @foreach(以型号VAR项)
    {
        &所述; TR>
            < TD类=submitCheck>
                @ Html.EditorFor(modelItem => item.Submitted)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.Company)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.Category)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.Province)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.ReceiptName)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.Comment)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.GrossAmount)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.TaxAmount)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.NetAmount)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.Mileage)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.TravelStatus)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.LunchLearnStatus)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.WithClientStatus)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.DateEntered)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.DateSubmitted)
            < / TD>
            &所述; TD>
                @ Html.DisplayFor(modelItem => item.ExpenseDate)
            < / TD>
            &所述; TD>
                @if(item.ImageName!= NULL)
                {
                    < A HREF =~/Images/@Html.DisplayFor(modelItem => item.UserProfile.FullName)/ @ Html.DisplayFor(modelItem => item.ImageName)级=imageClick目标=_空白 >< IMG SRC =~/Images/@Html.DisplayFor(modelItem => item.UserProfile.FullName)/ @ Html.DisplayFor(modelItem => item.ImageName)ALT =图片的风格=宽度:80%/>< / A>
                }
            < / TD>
            @if(User.IsInRole(管理员))
            {
                &所述; TD>
                    @ Html.DisplayFor(modelItem => item.UserProfile.UserName)
                < / TD>
            }
            &所述; TD>
                @ Html.ActionLink(编辑,编辑,新{ID = item.ExpenseId})|
                @ Html.ActionLink(详细信息,详细信息,新{ID = item.ExpenseId})|
                @if(User.IsInRole(管理员))
                {
                    @ Html.ActionLink(删除,删除,新{ID = item.ExpenseId})
                }            < / TD>
        < / TR>
    }< /表> @ Html.ActionLink(提交费用,SubmitExpenses,费用,空,新的{@class =submitLink,@style =背景色:#d3dce0;边界:1px的固体#787878;光标:指针; FONT-SIZE:1.5em; FONT-重量:600;保证金右:8像素;填充:7px的;宽度:汽车;文字修饰:无;字体重量:大胆;})< D​​IV CLASS =ExportSection的风格=的margin-top:30PX;>
    @ *< A HREF =JavaScript的:无效(0)>导出为CSV< / A> * @
    @ Html.ActionLink(导出为CSV,ExportExpensesListToCSV)
< / DIV>
}@section脚本{
<脚本类型=文/ JavaScript的>
    $(#selectAllCheckboxes)。点击(函数(){
        $('。submitCheck输入:复选框')不是(这个).prop('检查',this.checked);
    });    $(函数(){
        $(#expenseDate)日期选择器();
    });    $(函数(){
        $(#expenseDate2)日期选择器();
    });< / SCRIPT>}

这是我的控制器的方法:

 公众的ActionResult SubmitExpenses(列表<费用和GT;??费用,日期expenseDate = NULL,日期expenseDate2 = NULL,INT用户id = 0)
    {
        expenseDate =(DateTime的)会议[FirstDate];
        expenseDate2 =(DateTime的)会议[SecondDate];        如果(expenseDate == NULL || expenseDate2 == NULL)
        {
            expenseDate = DateTime.Now.AddMonths(-1);
            expenseDate2 = DateTime.Today;
        }        字符串currentUserId = User.Identity.Name;        VAR查询从E =在db.Expenses
                    在db.UserProfiles加入用户的e.UserId等于user.UserId
                    其中,e.ExpenseDate> = expenseDate和放大器;&安培; e.ExpenseDate< = expenseDate2和放大器;&安培; e.DateSubmitted == NULL
                    排序依据e.ExpenseDate降
                    选择新的{E,用户};        如果(User.IsInRole(管理员)及和放大器;!用户id = 0)
        {
            查询= query.Where(X => x.user.UserId ==用户id);
        }
        否则,如果(!User.IsInRole(管理员))
        {
            查询= query.Where(X => x.user.UserName == currentUserId);
        }        VAR expensesFromView =费用;        VAR在query.Select(X => x.e)加盟=从dbExpense .AsEnumerable()
                     加入localExpense在费用上dbExpense.ExpenseId等于localExpense.ExpenseId
                     其中,localExpense.Submitted
                     选择dbExpense;        的foreach(在费用EXP加入)
        {
            exp.DateSubmitted = DateTime.Today;
        }        尝试
        {
            db.SaveChanges();
            返回RedirectToAction(「指数」);
        }
        赶上(例外五)
        {
            Console.WriteLine(E);
            返回RedirectToAction(提交);
        }    }

下面是我的模型:

  [重点]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)
    公众诠释ExpenseId {搞定;组; }    [需要]
    公共字符串公司{搞定;组; }    [需要]
    公共字符串类别{搞定;组; }    [需要]
    [显示(NAME =收据名称)]
    公共字符串ReceiptName {搞定;组; }
    公共字符串评论{搞定;组; }    [需要]
    公共字符串省{搞定;组; }    [需要]
    [显示(NAME =总金额)]
    公共小数GrossAmount {搞定;组; }    [需要]
    [显示(NAME =GST / HST金额)]
    公共小数TAXAMOUNT {搞定;组; }    [需要]
    [显示(NAME =净金额)]
    公共小数NetAmount {搞定;组; }    [显示(NAME =里程(以公里为单位))]
    公众诠释里程{搞定;组; }    [显示(NAME =旅行?)]
    公共BOOL TravelStatus {搞定;组; }    [显示(NAME =午餐和放大器;了解?)]
    公共BOOL LunchLearnStatus {搞定;组; }    [显示(NAME =与客户?)]
    公共BOOL WithClientStatus {搞定;组; }    [DisplayFormat(DataFormatString ={0:MM / DD / YYYY})]
    [需要]
    [显示(NAME =输入的日期)]
    公众的DateTime? DateEntered {搞定;组; }    [DisplayFormat(DataFormatString ={0:MM / DD / YYYY})]
    [显示(NAME =呈交日期)]
    公众的DateTime? DateSubmitted {搞定;组; }    [DisplayFormat(DataFormatString ={0:MM / DD / YYYY})]
    [需要]
    [显示(名称=费用日期)]
    公众的DateTime? ExpenseDate {搞定;组; }    [显示(NAME =图片)]
    公共字符串ImageName {搞定;组; }    [显示(NAME =提交?)]
    公共BOOL提交{搞定;组; }    [需要]
    [显示(名称=名称)]
    公众诠释用户ID {搞定;组; }
    [ForeignKey的(用户ID)]
    公共虚拟用户配置用户配置{搞定;组; }

我的变量 expensesFromView 是显示为空,因此,我得到我的加入查询的错误说:


  

值不能为空。参数名:内



解决方案

我真的无法找到一种方法,通过直接从视图控制器项目的列表,所以我决定使用AJAX。

我改变了我的控制器的参数从键入列表与LT;> INT [] 可采取项目ID数组:

 公众的ActionResult SubmitExpenses(INT [] expenseIDs,日期时间?expenseDate = NULL,日期时间?expenseDate2 = NULL,INT?用户id = 0)
    {
        expenseDate =(DateTime的)会议[FirstDate];
        expenseDate2 =(DateTime的)会议[SecondDate];        如果(expenseDate == NULL || expenseDate2 == NULL)
        {
            expenseDate = DateTime.Now.AddMonths(-1);
            expenseDate2 = DateTime.Today;
        }        字符串currentUserId = User.Identity.Name;        VAR查询从E =在db.Expenses
                    在db.UserProfiles加入用户的e.UserId等于user.UserId
                    其中,e.ExpenseDate> = expenseDate和放大器;&安培; e.ExpenseDate< = expenseDate2和放大器;&安培; e.DateSubmitted == NULL
                    排序依据e.ExpenseDate降
                    选择新的{E,用户};        如果(User.IsInRole(管理员)及和放大器;!用户id = 0)
        {
            查询= query.Where(X => x.user.UserId ==用户id);
        }
        否则,如果(!User.IsInRole(管理员))
        {
            查询= query.Where(X => x.user.UserName == currentUserId);
        }        // VAR localExpenseIDs = expenseIDs;        VAR在query.Select(X => x.e)加盟=从dbExpense .AsEnumerable()
                     加入localExpense在expenseIDs上dbExpense.ExpenseId等于localExpense
                     其中,localExpense == dbExpense.ExpenseId
                     选择dbExpense;        的foreach(在费用EXP加入)
        {
            exp.DateSubmitted = DateTime.Today;
            exp.IsSubmitted = TRUE;
        }        尝试
        {
            db.SaveChanges();
            返回RedirectToAction(「指数」);
        }
        赶上(例外五)
        {
            Console.WriteLine(E);
            返回RedirectToAction(提交);
        }    }

在我看来,我分配每个项目的ID,以它自己的HTML复选框的id:

  @foreach(以型号VAR项)
    {
        &所述; TR>
            < TD类=复选框-TD>
                @ Html.CheckBox(isSubmitted,新
           {
               @id = @ Html.DisplayFor(modelItem => item.ExpenseId)
               @class =submitBox
           })
            < / TD>
        < / TR>
     }< D​​IV>
    @ Html.ActionLink(提交开支,,,空,新的{@id =submitExpensesLink})
< / DIV>

我写了一些jQuery,使每个被选中的复选框,将输入元素的ID添加到一个数组和整数数组会的 POST方法的的 SubmitExpenses 的行动:

  VAR checkedArray = [];    $(':复选框[名称= isSubmitted]')上('变化',函数(){。        checkedArray = $(':复选框[名称= isSubmitted]:勾选)。图(函数(){
                返回this.id;
         })
        。得到();
        //警报(checkedArray);
    });    $('#submitExpensesLink')。点击(函数(){        $阿贾克斯({
            键入:POST,
            传统:真实,
            网址:@ Url.Action(SubmitExpenses,费用),
            数据:{expenseIDs:checkedArray},
        成功:函数(){
            警报(成功!);
        },
        错误:功能(XMLHtt prequest,textStatus,errorThrown){
            如果(调试){
                警报(XMLHtt prequest.responseText);
                警报(textStatus);
                警报(errorThrown);
            }
        }
    });
    })

I'm trying to pass multiple items of type List<item> to my controller, however, when I submit my data, it show as null in my controller.

What I would like to happen is that I have a list of 'expenses' in the View, and beside each 'expense' or item is a checkbox from the Submitted Boolean property in my Model. When I check the items, I would like the list of checked items' properties Submitted and DateSubmitted to be updated in the database.

@Html.DisplayFor(modelItem => item.Submitted) in the View produces checkboxes.

What am I doing wrong?

Here is my View:

@model IEnumerable<Expenses.Models.Expense>

@{
ViewBag.Title = "Submit Expenses";
Layout = "~/Views/Shared/_Layout.cshtml";

DateTime today = DateTime.Today;
string formattedDate = today.ToString("MM/dd/yyyy");
}

<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

<h2>Submit Expenses</h2>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-inline">
    <div class="form-group">
        <h4>Start Date:</h4>
        <div class="col-md-10">
            @Html.TextBox("expenseDate", formattedDate, htmlAttributes: new
           {
               @class = "form-control"
           })
        </div>
    </div>

    <div class="form-group">
        <h4>End Date:</h4>
        <div class="col-md-10">
            @Html.TextBox("expenseDate2", formattedDate, htmlAttributes: new
           {
               @class = "form-control"
           })
        </div>
    </div>

    <div class="form-group">
        @if (User.IsInRole("admin"))
        {
            <h4>Username:</h4>
            <div class="editor-field">
                @Html.DropDownList("UserId", String.Empty)
            </div>
        }
    </div>

    <br />
    <br />

    <div class="form-group">
        <div class="col-md-2">
            <input type="submit" value="Retrieve Expenses" class="btn btn-default" />
        </div>
    </div>

</div>

<br />
<br />


<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table style="margin-bottom: 20px;">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Company)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Category)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Province)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ReceiptName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Comment)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.GrossAmount)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.TaxAmount)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.NetAmount)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Mileage)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.TravelStatus)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.LunchLearnStatus)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.WithClientStatus)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.DateEntered)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.DateSubmitted)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ExpenseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ImageName)
        </th>
        @if (User.IsInRole("admin"))
        {
            <th>
                @Html.DisplayNameFor(model => model.UserProfile.UserName)
            </th>
        }
        <th></th>
    </tr>
    <tr>
        <td>
            <b>Select All:</b>
            <br />
            <input type="checkbox" name="expense" value="Expense" id="selectAllCheckboxes" class="expenseCheck">
        </td>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td class="submitCheck">
                @Html.EditorFor(modelItem => item.Submitted)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Company)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Category)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Province)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReceiptName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Comment)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.GrossAmount)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TaxAmount)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.NetAmount)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Mileage)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TravelStatus)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.LunchLearnStatus)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.WithClientStatus)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DateEntered)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DateSubmitted)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ExpenseDate)
            </td>
            <td>
                @if (item.ImageName != null)
                {
                    <a href="~/Images/@Html.DisplayFor(modelItem => item.UserProfile.FullName)/@Html.DisplayFor(modelItem => item.ImageName)" class="imageClick" target="_blank"><img src="~/Images/@Html.DisplayFor(modelItem => item.UserProfile.FullName)/@Html.DisplayFor(modelItem => item.ImageName)" alt="Image" style="width:80%" /></a>
                }
            </td>
            @if (User.IsInRole("admin"))
            {
                <td>
                    @Html.DisplayFor(modelItem => item.UserProfile.UserName)
                </td>
            }
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.ExpenseId }) |
                @Html.ActionLink("Details", "Details", new { id = item.ExpenseId }) |
                @if (User.IsInRole("admin"))
                {
                    @Html.ActionLink("Delete", "Delete", new { id = item.ExpenseId })
                }

            </td>
        </tr>
    }

</table>

 @Html.ActionLink("Submit Expenses", "SubmitExpenses", "Expenses", null, new { @class = "submitLink", @style = "background-color: #d3dce0; border: 1px solid #787878; cursor: pointer; font-size: 1.5em; font-weight: 600; margin-right: 8px; padding: 7px; width: auto; text-decoration: none; font-weight:bold;"})

<div class="ExportSection" style="margin-top:30px;">
    @*<a href="javascript:void(0)">Export To CSV</a>*@
    @Html.ActionLink("Export To CSV", "ExportExpensesListToCSV")
</div>
}

@section scripts {
<script type="text/javascript">


    $("#selectAllCheckboxes").click(function () {
        $('.submitCheck input:checkbox').not(this).prop('checked', this.checked);
    });

    $(function () {
        $("#expenseDate").datepicker();
    });

    $(function () {
        $("#expenseDate2").datepicker();
    });

</script>

}

and here is my Controller method:

public ActionResult SubmitExpenses(List<Expense> expenses, DateTime? expenseDate = null, DateTime? expenseDate2 = null, int? userId = 0)
    {
        expenseDate = (DateTime)Session["FirstDate"];
        expenseDate2 = (DateTime)Session["SecondDate"];

        if (expenseDate == null || expenseDate2 == null)
        {
            expenseDate = DateTime.Now.AddMonths(-1);
            expenseDate2 = DateTime.Today;
        }

        string currentUserId = User.Identity.Name;

        var query = from e in db.Expenses
                    join user in db.UserProfiles on e.UserId equals user.UserId
                    where e.ExpenseDate >= expenseDate && e.ExpenseDate <= expenseDate2 && e.DateSubmitted == null
                    orderby e.ExpenseDate descending
                    select new { e, user };

        if (User.IsInRole("admin") && userId != 0)
        {
            query = query.Where(x => x.user.UserId == userId);
        }
        else if (!User.IsInRole("admin"))
        {
            query = query.Where(x => x.user.UserName == currentUserId);
        }

        var expensesFromView = expenses;

        var joined = from dbExpense in query.Select(x => x.e).AsEnumerable()
                     join localExpense in expenses on dbExpense.ExpenseId equals localExpense.ExpenseId
                     where localExpense.Submitted
                     select dbExpense;

        foreach (Expense exp in joined)
        {
            exp.DateSubmitted = DateTime.Today;
        }

        try
        {
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return RedirectToAction("Submit");
        }

    }

Here is my model:

[Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ExpenseId { get; set; }

    [Required]
    public string Company { get; set; }

    [Required]
    public string Category { get; set; }

    [Required]
    [Display(Name = "Receipt Name")]
    public string ReceiptName { get; set; }
    public string Comment { get; set; }

    [Required]
    public string Province { get; set; }

    [Required]
    [Display(Name = "Gross Amount")]
    public decimal GrossAmount { get; set; }

    [Required]
    [Display(Name = "GST/HST Amount")]
    public decimal TaxAmount { get; set; }

    [Required]
    [Display(Name = "Net Amount")]
    public decimal NetAmount { get; set; }

    [Display(Name = "Mileage (in Kilometers)")]
    public int Mileage { get; set; }

    [Display(Name = "Travelling?")]
    public bool TravelStatus { get; set; }

    [Display(Name = "Lunch & Learn?")]
    public bool LunchLearnStatus { get; set; }

    [Display(Name = "With Clients?")]
    public bool WithClientStatus { get; set; }

    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    [Required]
    [Display(Name = "Date Entered")]
    public DateTime? DateEntered{ get; set; }

    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    [Display(Name = "Date Submitted")]
    public DateTime? DateSubmitted { get; set; }

    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    [Required]
    [Display(Name = "Expense Date")]
    public DateTime? ExpenseDate { get; set; }

    [Display(Name = "Image")]
    public string ImageName { get; set; }

    [Display(Name = "Submitted?")]
    public bool Submitted { get; set; }

    [Required]
    [Display(Name = "Name")]
    public int UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual UserProfile UserProfile { get; set; }

My variable expensesFromView is showing as null and as a result, I get an error on my joined query that says:

Value cannot be null. Parameter name: inner

解决方案

I couldn't really find a way to pass a list of items directly from View to Controller, so I decided to use AJAX.

I changed the parameters of my Controller from type List<> to int[ ] to take an array of item IDs:

public ActionResult SubmitExpenses(int[] expenseIDs, DateTime? expenseDate = null, DateTime? expenseDate2 = null, int? userId = 0)
    {
        expenseDate = (DateTime)Session["FirstDate"];
        expenseDate2 = (DateTime)Session["SecondDate"];

        if (expenseDate == null || expenseDate2 == null)
        {
            expenseDate = DateTime.Now.AddMonths(-1);
            expenseDate2 = DateTime.Today;
        }

        string currentUserId = User.Identity.Name;

        var query = from e in db.Expenses
                    join user in db.UserProfiles on e.UserId equals user.UserId
                    where e.ExpenseDate >= expenseDate && e.ExpenseDate <= expenseDate2 && e.DateSubmitted == null
                    orderby e.ExpenseDate descending
                    select new { e, user };

        if (User.IsInRole("admin") && userId != 0)
        {
            query = query.Where(x => x.user.UserId == userId);
        }
        else if (!User.IsInRole("admin"))
        {
            query = query.Where(x => x.user.UserName == currentUserId);
        }

        //var localExpenseIDs = expenseIDs;

        var joined = from dbExpense in query.Select(x => x.e).AsEnumerable()
                     join localExpense in expenseIDs on dbExpense.ExpenseId equals localExpense
                     where localExpense == dbExpense.ExpenseId
                     select dbExpense;

        foreach (Expense exp in joined)
        {
            exp.DateSubmitted = DateTime.Today;
            exp.IsSubmitted = true;
        }

        try
        {
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return RedirectToAction("Submit");
        }

    }

In my view, I assigned the ID of each item to the id of it's own HTML checkbox :

@foreach (var item in Model)
    {
        <tr>
            <td class="checkbox-td">
                @Html.CheckBox("isSubmitted", new
           {
               @id = @Html.DisplayFor(modelItem => item.ExpenseId),
               @class = "submitBox"
           })
            </td>
        </tr>
     }

<div>
    @Html.ActionLink("Submit Expenses", "", "", null, new { @id = "submitExpensesLink" })
</div>

I wrote some jQuery, so that each checkbox that is checked, will add the id of the input element to an array and the array of integers would be POSTed to the SubmitExpenses action:

var checkedArray = [];

    $(':checkbox[name=isSubmitted]').on('change', function () {

        checkedArray = $(':checkbox[name=isSubmitted]:checked').map(function () {
                return this.id;
         })
        .get();


        //alert(checkedArray);
    });

    $('#submitExpensesLink').click(function () {

        $.ajax({
            type: "POST",
            traditional: true,
            url: "@Url.Action("SubmitExpenses", "Expenses")",
            data: { expenseIDs: checkedArray },
        success: function () {
            alert("Success!");
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            if (debug) {
                alert(XMLHttpRequest.responseText);
                alert(textStatus);
                alert(errorThrown);
            }
        }
    });
    })

这篇关于如何通过项目列表,从视图控制器(ASP.NET MVC 4)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆