【问题标题】:How to pass values entered in one html page and display the executed result in another html page如何传递在一个 html 页面中输入的值并在另一个 html 页面中显示执行结果
【发布时间】:2018-01-07 18:07:22
【问题描述】:

我需要选择Quarter and Year 然后在提交时这两个值应该被传递给我的存储过程"SummaryProc" 并且在执行之后它将传递ID 的行.....如果我写的代码请指导我很好。我错过了链接,因为我无法理解如何链接所有这些。工作应用程序将是"Enter Quarter & Year in _Summary.cshtml -> Pass values to Controller -> Execution in Repository code -> rows returned from stored proc to be displayed in SummaryTable.cshtml"

_Summary.cshtml

                     <div class="form-group">
                    <label class="control-label col-lg-4">Period:</label>
                    <div class="col-lg-8">
                        @Html.DropDownList("Quarter", new SelectListItem[] { (new SelectListItem() { Text = "Q1", Value = "1" }), (new SelectListItem() { Text = "Q2", Value = "2" }), (new SelectListItem() { Text = "Q3", Value = "3" }), (new SelectListItem() { Text = "Q4", Value = "4" }) }, "--Select Quarter--", new { @class = "form-control", id = "Quarter" })
                        <br />
                        @Html.DropDownList("Year", new SelectListItem[] { (new SelectListItem() { Text = "2016", Value = "2016" }), (new SelectListItem() { Text = "2017", Value = "2017" }) }, "--Select Year--", new { @class = "form-control", id = "Year" })
                    </div>
                </div>

                    <div class="row">
                        <div class="col-lg-offset-4" style="padding: 10px 0px 0px 0px;">
                            <input type="submit" id="submit" value="Submit" class="btn btn-lg btn-success" />
                        </div>
                    </div>

控制器代码:

  [ActionName("_Summary")]
            [HttpPost]

            public ActionResult _Summary(FloorPlanViewModel model, FormCollection form)
            {

                SummaryConfiguration sumConfig = new SummaryConfiguration();
            sumConfig.Quarter = Convert.ToInt32(form["Quarter"]);
            sumConfig.Year = Convert.ToInt32(form["Year"]);
            var details = floorService.SummaryProc(sumConfig.Quarter, sumConfig.Year);
            return PartialView("SummaryTable", details);

            }

执行存储过程的代码:

 public IEnumerable<SummaryConfiguration> SummaryProc(int Quarter, int Year)
          {
              var model = new List<SummaryConfiguration>();


              using (var dbCmd = defaultDB.GetStoredProcCommand("dbo.SummaryProc"))
              {
                  defaultDB.AddInParameter(dbCmd, "Quarter", System.Data.DbType.Int32, Quarter);
                  defaultDB.AddInParameter(dbCmd, "Year", System.Data.DbType.Int32, Year);
                  var varCmd = defaultDB.ExecuteReader(dbCmd);

                  while (varCmd.Read())
                  {
                      // add items in the list
                      model.Add(new SummaryConfiguration()
                      {
                          ID = Convert.ToString(varCmd["ID"]),
                        //rest of the code
                      });
                  }
              }
              return model;
          }

【问题讨论】:

  • 如果要返回不同的视图,需要指定视图名称。但是为什么你不绑定到你的模型而不是使用像Convert.ToInt32(form["Quarter"]这样的代码。如果您使用 ajax 发布选项值并使用表格的部分视图更新现有视图,您将获得更好的性能。
  • 而您的SummaryProc 方法返回IEnumerable&lt;SummaryConfiguration&gt;,因此@foreach (var item in Model.sumConfig) 毫无意义(IEnumerable&lt;T&gt; 不包含任何属性)并且您的代码只会抛出this exception
  • @StephenMuecke 所以我可以使用'@foreach(模型中的变量项)'吗?
  • 是的,你可以(但是你没有在新视图中显示选定的选项,这不利于良好的用户界面)
  • 在下一个视图中,我需要在表格中显示 lineid、项目等。我对代码做了一些更改..让我更新问题

标签: c# html asp.net-mvc model-view-controller


【解决方案1】:

在不使用 ajax 的情况下处理此问题的典型方法是使用单个 GET 方法并查看回传到该方法的内容。

首先创建一个视图模型来表示您的视图

public class SummaryConfigurationVM
{
    public int Quarter { get; set; }
    public int Year { get; set; }
    public IEnumerable<SummaryConfiguration> Configurations { get; set; }
    public IEnuemrable<SelectListItem> QuarterList { get; set; }
    public IEnuemrable<SelectListItem> YearListList { get; set; }
}

并添加任何可能适用于QuarterYear 的验证属性(例如[Range] 属性)

你的控制器方法将是

public ActionResult Summary(int? quarter, int? year)
{
    IEnumerable<SummaryConfiguration> configurations = new List<SummaryConfiguration>();
    if (quarter.HasValue && year.HasValue)
    {
        configurations = floorService.SummaryProc(quarter.Value, year.Value);
    }
    SummaryConfigurationVM model = new SummaryConfigurationVM()
    {
        Quarter = quarter,
        Year = year,
        Configurations = configurations,
        QuarterList = new List<SelectListItem>()
        {
            new SelectListItem(){ Text = "Q1", Value = "1" },
            ....
        },
        YearList = new List<SelectListItem>()
        {
            ....
        }
    };
    return View(model);
}

请注意,您还需要考虑验证 quarteryear 的值是否在预期范围内。

你的视图将是

@model SummaryConfigurationVM
....
@using (Html.BeginForm("Summary", "yourControllerName", FormMethod.Get))
{
    @Html.LabelFor(m => m.Quarter)
    @Html.DropDownListFor(m => m.Quarter, Model.QuarterList, "--Select Quarter--")
    @Html.ValidationMessageFor(m => m.Quarter)

    .... // ditto for Year

    <input type="submit" value="Submit" />
}

<table>
    <thead>
        <tr>
            <th>@Html.DisplayNameFor(m => m.Configurations.FirstOrDefault().LineID)</th>
            ....
        </tr>
    </thead>
    <tbody>
        @foreach( var item in Model.Configurations)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => item.LineID)</td>
                .... // other properties of SummaryConfiguration
            </tr>
        }
    </tbody>
</table>

您也可以考虑在@if (Model.Configuraton.Any()) { 块中呈现&lt;table&gt;(如果false 显示一条消息,指出未找到任何结果。

【讨论】:

  • 我根据你的回答做了修改。但是当我运行应用程序时,它没有打开我需要输入季度和年份的页面。抛出异常“ [ArgumentException:参数字典包含不可为空类型'System.Int32'的参数'季度'的空条目对于“USTGlobal.WorkBench.UI.Controllers.FloorPlanController”中的方法“System.Web.Mvc.ActionResult SummaryTable(Int32, Int32)”。可选参数必须是引用类型、可为空的类型或声明为可选参数.参数名称:parameters]"
  • 如果您希望能够导航到页面并且不传递任何参数,那么只需将参数设置为nullable - 即public ActionResult Summary(int? quarter, int? year),但您肯定需要验证它们不是null 在运行查询之前
  • 例如,如果其中一个是 null,那么您可以将您的 Configurations 设置为一个空列表(而不是调用 SummaryProc() 方法。给我 10 分钟,我会更新答案一个典型的例子,但你可能需要根据你的逻辑来修改它
  • 我做了更改。这个特殊的例外现在已经消失了。但是我在 SummaryProc 遇到了另一个关于强制转换“对象不能从 DBNull 转换为其他类型”的异常。
  • 调用方法的时候有没有使用quarter.Value, year.Value
猜你喜欢
  • 2013-04-13
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
相关资源
最近更新 更多