2013-05-16 57 views
0

我想在asp.net MVC查询控件和results.Aka发布控件值和显示结果在同一页上的一个很好的例子。查询和结果在同一页

我谷歌在这一点,但无法找到任何例子

+3

这是一个巨大的问题,完全依赖于任何其他因素。你想不同步吗?模型如何“复杂”,以及“所有返回数据”有多少数据?从这里开始:http://www.asp.net/mvc,回来一个更具体的问题。 –

+0

谢谢克里斯,我简化了我的问题。 – ron

回答

0

我会什么,我认为你把裂缝是后,这是具有形状+结果在同一页上。我最近遇到了这个问题,我需要这种模式,并且增加了两种方法(表单和表单+结果)所需的复杂性。不是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); 
} 

查看在剃刀,其持有的形式,再加上表中报告的结果:

@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> 
    } 
} 

最后,仅供参考,我的视图模型:

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(); 
      } 
     } 
    } 
} 

这视图模型下RefundReportResultItem类是人C对于报告中每个结果项目的数据都不重要。

+0

感谢格雷厄姆,让ViewModel包含请求参数并使其效果非常好! – ron

+0

是的,我发现“胖视图模型,瘦控制器,愚蠢的看法”的风格真的很有帮助。 ViewModel应该回答关于它自己的所有问题,并公开控制器或视图需要完成其工作的任何内容,但仅限于此。我真的很喜欢从控制器内部,你可以这样做:'返回View(“Refunds”,refundVM);',它可以让你绑定请求到不同的View,同时传递一个Model。 – Graham