查询和结果在同一页面上

时间:2013-05-16 12:55:14

标签: asp.net-mvc asp.net-mvc-4

我正在尝试在asp.net MVC查询控件和结果中寻找一个很好的例子.Aka发布控件值并在同一页面上显示结果。

我谷歌就这个但找不到任何例子

1 个答案:

答案 0 :(得分:0)

我会对我想到的事情有所了解,即在同一页面上有一个表格+结果。我最近遇到了我想要这种模式的问题,增加的复杂性是两种方法(形式和形式+结果)都需要GET。不是GET和POST。我是这样做的:

控制器方法:

// GET: /Reports/Refund
public ActionResult Refunds()
{
    var refundVM = new RefundCheckReportViewModel();
    return View(refundVM);
}

// GET: /Reports/Refund
public ActionResult RefundsResult(RefundCheckReportViewModel refundVM) 
{
    string errorMsg;
    var ready = refundVM.IsReadyToRun(out errorMsg);

    if (!ready)
        ModelState.AddModelError("StartDate", errorMsg);
    else
        refundVM.LoadReportData(); // this method on the ViewModel fetches the report data.

    return View("Refunds", refundVM);
}

在Razor中查看,其中包含表单,以及报告结果的表格:

@model MembershipCenter.ViewModels.Report.RefundCheckReportViewModel

@{
    ViewBag.Title = "Refunds";
}

<div class="formStandard">


    @using (Html.BeginForm("RefundsResult", "Reports", FormMethod.Get))
    {

        <div class="fsHeader">
            <span class="reqLabel"><a class="req">*</a>required field</span>
            <strong>Refund Check Report</strong>
        </div>

         <div class="fsBlock">
            <div class="text">Date Range: <a class="req">*</a></div>
            <div class="elem">
                <span class="dateRangePicker">
                    From: @Html.TextBoxFor(model => model.StartDate, new { @class = "short datepicker" })
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    To: @Html.TextBoxFor(model => model.EndDate, new { @class = "short datepicker" })
                    @Html.ValidationMessageFor(model => model.StartDate)
                </span>
            </div>
        </div>



        <div class="fsFinalActions">
            <input type="submit" value="Generate Report" />
        </div>
    }

</div> <!-- end .formStandard -->



@if (Model.ReportData != null)
{
    if (Model.ReportData.Any()) {
        <table class="colorTable" style="margin-top: 30px;" id="resultTable">
            <thead>
                <tr>
                    <th>Date</th>
                    <th>Member #</th>
                    <th>Amount</th>
                    <th>Check #</th>
                    <th>Name</th>
                    <th>Reason</th>
                </tr>
            </thead>
            <tbody>
                @foreach (MembershipCenter.ViewModels.Report.RefundCheckReportViewModel.RefundReportResultItem item in Model.ReportData)
                {
                    <tr>
                        <td>@item.PrintedDate</td>
                        <td>@Html.GetMemberLink(item.MemberNumber)</td>
                        <td>@item.Amount</td>
                        <td>@item.CheckNumber</td>
                        <td>@item.PayeeName</td>
                        <td>@item.Reason</td>
                    </tr>
                }
            </tbody>
        </table>
    }
    else {
        <div><strong>There are not Refunds for the criteria above.</strong></div>
    }
}

最后,作为参考,我的ViewModel:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Membership = Biz.Business.Membership;
using Printing = Biz.Business.Printing;

namespace MembershipCenter.ViewModels.Report
{
    public class RefundCheckReportViewModel
    {
        [Required]
        public DateTime? StartDate { get; set; }
        [Required]
        public DateTime? EndDate { get; set; }

        public List<RefundReportResultItem> ReportData = null;

        public RefundCheckReportViewModel()
        {
        }

        public bool IsReadyToRun(out string errorMessage)
        {
            errorMessage = string.Empty;

            if (!StartDate.HasValue || !EndDate.HasValue)
                errorMessage = "Please enter a start and end date";

            else if (StartDate.Value <= new DateTime(2012, 11, 1).Date)
                errorMessage = "Please enter a date greater than 11/1/2012 for the Start Date.";

            return (errorMessage.IsNullOrEmpty());
        }

        public void LoadReportData()
        {
            ReportData = new List<RefundReportResultItem>();

            var refunds = Membership.Getrefunds(blah);
            var checks = Printing.GetChecks(blah);

            foreach (var refund in refunds)
            {
                var check = checks.SingleOrDefault(c => c.RequestReferenceId == refund.Request.Id);
                if (check != null)
                    ReportData.Add(new RefundReportResultItem(refund, check));
            }
        }

        public class RefundReportResultItem
        {
            public int CheckNumber { get; set; }
            public decimal Amount { get; set; }
            public string PayeeName { get; set; }
            public string MemberNumber { get; set; }
            public string Reason { get; set; }
            public string PrintedDate { get; set; }

            public RefundReportResultItem(Membership.Refund refund, Printing.PrintedCheck check)
            {
                MemberNumber = refund.MemberId;
                Reason = refund.Note;
                Amount = refund.Amount;

                PayeeName = check.Payee;
                CheckNumber = check.CheckNumber;
                PrintedDate = check.QueuedToPrint.ToShortDateString();
            }
        }
    }
}

ViewModel下的RefundReportResultItem类是报表中每个结果项的数据的持有者类。