C# IList未正确发回控制器
我遇到了这样一种情况:我需要能够批量编辑记录并将其发布回我的MVC4控制器。我有一个自定义视图模型的列表,我可以在索引视图上正确地传递和编辑该列表。但是,当我提交表单并尝试使用post方法访问列表时,我无法检索相同的列表。最多只能获取第一条记录,否则将获取null。如何获取整个对象列表 视图模型:C# IList未正确发回控制器,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我遇到了这样一种情况:我需要能够批量编辑记录并将其发布回我的MVC4控制器。我有一个自定义视图模型的列表,我可以在索引视图上正确地传递和编辑该列表。但是,当我提交表单并尝试使用post方法访问列表时,我无法检索相同的列表。最多只能获取第一条记录,否则将获取null。如何获取整个对象列表 视图模型: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using S
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace SitefinityWebApp.Mvc.Models
{
public class CheckoutViewModel
{
public string Title { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public string Email { get; set; }
[Required]
public string Phone { get; set; }
public string PTIN { get; set; }
public string Sku { get; set; }
public Guid CartOrderId { get; set; }
public string IRSCourseNumber { get; set; }
public string Id { get; set; }
}
}
控制器:
public ActionResult Index()
{
Guid gdShoppingCartId = cmmObj.GetShoppingCartId();
List<SitefinityWebApp.Custom.Surgent.sf_ec_cart_detail> cartdetails = new List<SitefinityWebApp.Custom.Surgent.sf_ec_cart_detail>();
SubSiteProductRepository ssp = new SubSiteProductRepository();
List<CheckoutViewModel> cvml = new List<CheckoutViewModel>();
if (gdShoppingCartId != Guid.Empty && gdShoppingCartId != null)
{
cartdetails = DbContext.sf_ec_cart_details.Where(d => d.cart_order_id == gdShoppingCartId).ToList();
if (cartdetails.Count > 0)
{
if (cartdetails.Where(c => c.need_registration2 == "true").Count() > 0)
{
var webinars = LoadWebinar();
//WebinarViewModel wvm = new WebinarViewModel();
foreach (DataRow row in webinars.Rows)
{
cvml.Add(new CheckoutViewModel
{
Sku = row["sku"].ToString(),
Id = row["id"].ToString(),
Title = row["title_"].ToString(),
CartOrderId = gdShoppingCartId,
IRSCourseNumber = row["irsCourseNumber"].ToString()
});
//foreach (DataColumn column in table.Columns)
//{
// object item = row[column];
// // read column and item
//}
}
}
}
}
return View(cvml);
}
[HttpPost]
public ActionResult Index([Bind(Prefix="cvm.")]IList<CheckoutViewModel> cvm)
{
int viewmodelerror = 0;
foreach(CheckoutViewModel c in cvm){
if (ModelState.IsValid)
{
//if (c.PTIN != null || c.PTIN != "")
//return Redirect("~/CheckOut");
}
else
{
viewmodelerror++;
//return View(cvm);
}
}
return View(cvm);
//return new EmptyResult();
}
public ActionResult Index()
{
Guid gdShoppingCartId=cmmObj.GetShoppingCartId();
List cartdetails=新列表();
SubfiteProductRepository ssp=新的SubfiteProductRepository();
List cvml=新列表();
if(gdShoppingCartId!=Guid.Empty&&gdShoppingCartId!=null)
{
cartdetails=DbContext.sf_ec_cart_details.Where(d=>d.cart_order_id==gdShoppingCartId.ToList();
如果(cartdetails.Count>0)
{
if(cartdetails.Where(c=>c.need_registration2==“true”).Count()>0)
{
var webinars=LoadWebinar();
//WebinarViewModel wvm=新的WebinarViewModel();
foreach(在线研讨会中的DataRow行)
{
添加(新的CheckoutViewModel)
{
Sku=行[“Sku”]。ToString(),
Id=行[“Id”]。ToString(),
Title=行[“Title”]。ToString(),
cartorrid=gdShoppingCartId,
IRSCourseNumber=行[“IRSCourseNumber”].ToString()
});
//foreach(table.Columns中的DataColumn列)
//{
//对象项=行[列];
////读取列和项
//}
}
}
}
}
返回视图(cvml);
}
[HttpPost]
公共行动结果索引([Bind(Prefix=“cvm”)]IList cvm)
{
int viewmodelerror=0;
foreach(cvm中的CheckoutViewModel c){
if(ModelState.IsValid)
{
//如果(c.PTIN!=null | | c.PTIN!=“”)
//返回重定向(“~/CheckOut”);
}
其他的
{
viewmodelerror++;
//返回视图(cvm);
}
}
返回视图(cvm);
//返回新的EmptyResult();
}
索引视图:
@model IList<SitefinityWebApp.Mvc.Models.CheckoutViewModel>
@{
var allWebinars = "http://" + Request.Url.Authority + "/CheckOut";
}
<div id="registration-content">
<div class='row'>
<div class='columns medium-12'>
<h1>Attendee Information</h1>
</div>
</div>
<div class='row'>
<div class='columns medium-9'>
<div class='columns medium-12'>
<p class='instructions'>Please complete attendee information for the following courses:</p>
</div>
@foreach (SitefinityWebApp.Mvc.Models.CheckoutViewModel cvm in Model)
{
@Html.EditorFor(x => cvm.FirstName)
}
@Html.BeginForm(){
@for (int i = 0; i < Model.Count; i++)
{
<div class='columns medium-12'>
<!--FIRST PRODUCT DESCRIPTION-->
<div class="product-description">
<p class='course-link'><a href="webinars.html">@Html.DisplayFor(t => t[i].Title)</a></p>
<p class='small'>Accounting</p>
</div>
</div>
<div class='columns medium-12'>
<form>
<!-- BASIC FORM LAYOUT FOR THE PAGE -->
<div class='row'>
<div class='columns medium-4'>
<label>First Name @Html.EditorFor(t => t[i].FirstName)</label>
</div>
<div class='columns medium-4'>
<label>Last Name @Html.EditorFor(t => t[i].LastName)</label>
</div>
<div class='columns medium-4'>
<label>PTIN @Html.EditorFor(t => t[i].PTIN)</label>
</div>
</div>
<div class='row'>
<div class='columns medium-4'>
<label>Email Address @Html.EditorFor(t => t[i].Email)</label>
</div>
<div class='columns medium-4'>
<label>Phone Number @Html.EditorFor(t => t[i].Phone)</label>
</div>
<div class='columns medium-4'>
<p> </p>
</div>
</div>
</form>
</div>
}
}
</div>
<div class='columns medium-3' id="purchase-summary">
<!-- PURCHASE SUMMARY -->
<h2>Summary:</h2>
<table>
<tr>
<td>
<p>Products:</p>
</td>
<td>
<p>4</p>
</td>
</tr>
<tr>
<td>
<p>Subtotal:</p>
</td>
<td>
<p>$906.00</p>
</td>
</tr>
<tr>
<td>
<p>Discounts:</p>
</td>
<td>
<p>$0.00</p>
</td>
</tr>
<tr>
<td>
<h4>Total:</h4>
</td>
<td>
<h4>$906.00</h4>
</td>
</tr>
</table>
</div>
</div>
<div id="registration-buttons">
<div class='row'>
<div class='columns medium-9'>
<hr id="last-divider">
<div class='columns medium-6 small-6'>
<div id="registration-back">
<a href="#" class="course-link arrow-left">Back</a>
</div>
</div>
<div class='columns medium-6 small-6'>
<div class='float-right'>
@*<a class='button' href="@allWebinars">continue</a>*@
<button type="submit" id="submit">continue</button>
</div>
</div>
</div>
<div class='columns medium-3'> </div>
</div>
</div>
</div>
@model-IList
@{
var allWebinars=“http://“+Request.Url.Authority+”/CheckOut”;
}
与会者信息
请填写以下课程的学员信息:
@foreach(SitefinityWebApp.Mvc.Models.CheckoutViewModel模型中的cvm)
{
@EditorFor(x=>cvm.FirstName)
}
@Html.BeginForm(){
@for(int i=0;i
会计
First Name@Html.EditorFor(t=>t[i].FirstName)
姓氏@Html.EditorFor(t=>t[i].LastName)
PTIN@Html.EditorFor(t=>t[i].PTIN)
电子邮件地址@Html.EditorFor(t=>t[i].Email)
电话号码@Html.EditorFor(t=>t[i].Phone)
}
}
总结:
产品:
四,
小计:
906.00美元
折扣:
$0.00
总数:
$906.00
@**@
持续
编辑:我找到了解决办法。我在Html.BeginForm()方法中有表单标记(我不想要)。事后看来,这是有道理的,因为创建了多个表单,但只能提交第一个表单。代码的工作版本如下所示。谢谢你的帮助,Ste
@model IList<SitefinityWebApp.Mvc.Models.CheckoutViewModel>
@{
var allWebinars = "http://" + Request.Url.Authority + "/CheckOut";
}
@Html.BeginForm(){
<div id="registration-content">
<div class='row'>
<div class='columns medium-12'>
<h1>Attendee Information</h1>
</div>
</div>
<div class='row'>
<div class='columns medium-9'>
<div class='columns medium-12'>
<p class='instructions'>Please complete attendee information for the following courses:</p>
</div>
@foreach (SitefinityWebApp.Mvc.Models.CheckoutViewModel title in ViewBag.Titles)
{
var url = "http://" + Request.Url.Authority + "/webinar-product-details/" + title.Sku;
<div class='columns medium-12'>
<!--FIRST PRODUCT DESCRIPTION-->
<div class="product-description">
<p class='course-link'><a href="@url">@title.Title</a></p>
@*@Html.HiddenFor(t => t[i].Title)*@
@*<p class='small'>Accounting</p>*@
<p class='small'></p>
</div>
<br />
</div>
for (int i = 0; i < Model.Count; i++)
{
@Html.HiddenFor(t => t[i].Title)
@Html.HiddenFor(t => t[i].Type)
@Html.HiddenFor(t => t[i].IRSCourseNumber)
@Html.HiddenFor(t => t[i].Id)
@Html.HiddenFor(t => t[i].Sku)
if(Model[i].Title == title.Title){
<div class='columns medium-12'>
<!-- BASIC FORM LAYOUT FOR THE PAGE -->
<div class='row'>
<div class='columns medium-4'>
<label>First Name @Html.EditorFor(t => t[i].FirstName)</label>
@Html.ValidationMessageFor(t => t[i].FirstName)
</div>
<div class='columns medium-4'>
<label>Last Name @Html.EditorFor(t => t[i].LastName)</label>
@Html.ValidationMessageFor(t => t[i].LastName)
</div>
@if (Model[i].IRSCourseNumber != null && Model[i].IRSCourseNumber != "")
{
<div class='columns medium-4'>
<label>PTIN @Html.TextBoxFor(t => t[i].PTIN, new { @class = "ptin" })</label>
@Html.ValidationMessageFor(t => t[i].PTIN)
</div>
}else{
<div class='columns medium-4'>
<label> </label>
</div>
}
</div>
<div class='row'>
<div class='columns medium-4'>
<label>Email Address @Html.EditorFor(t => t[i].Email)</label>
@Html.ValidationMessageFor(t => t[i].Email)
</div>
<div class='columns medium-4'>
<label>Phone Number @Html.TextBoxFor(t => t[i].Phone, new { @class="phone"})</label>
@Html.ValidationMessageFor(t => t[i].Phone)
</div>
<div class='columns medium-4'>
<p> </p>
</div>
</div>
<br />
<br />
</div>
}
}
}
</div>
<div class='columns medium-3' id="purchase-summary">
<!-- PURCHASE SUMMARY -->
<h2>Summary:</h2>
<table>
<tr>
<td>
<p>Products:</p>
</td>
<td>
<p>4</p>
</td>
</tr>
<tr>
<td>
<p>Subtotal:</p>
</td>
<td>
<p>$906.00</p>
</td>
</tr>
<tr>
<td>
<p>Discounts:</p>
</td>
<td>
<p>$0.00</p>
</td>
</tr>
<tr>
<td>
<h4>Total:</h4>
</td>
<td>
<h4>$906.00</h4>
</td>
</tr>
</table>
</div>
</div>
<div id="registration-buttons">
<div class='row'>
<div class='columns medium-9'>
<hr id="last-divider">
<div class='columns medium-6 small-6'>
<div id="registration-back">
<a href="#" class="course-link arrow-left">Back</a>
</div>
</div>
<div class='columns medium-6 small-6'>
<div class='float-right'>
@*<a class='button' href="@allWebinars">continue</a>*@
<button class="submitButton" type="submit" id="submit">continue</button>
</div>
</div>
</div>
<div class='columns medium-3'> </div>
</div>
</div>
</div>
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.maskedinput/1.3.1/jquery.maskedinput.min.js">
</script>
<script>
jQuery(function ($) {
$(".phone").mask("999-999-9999");
$(".ptin").mask("99999999");
});
</script>
[HttpPost]
public ActionResult Index(IList<CheckoutViewModel> cvm)
{
int viewmodelerror = 0;
foreach(CheckoutViewModel c in cvm){
if (ModelState.IsValid)
{
//if (c.PTIN != null || c.PTIN != "")
//return Redirect("~/CheckOut");
}
else
{
viewmodelerror++;
//return View(cvm);
}
}
return View(cvm);
//return new EmptyResult();
}