我实际上在Model
中获得了Http Request
。但它没有加载到控制器中。
模型
public class ConfigurableItemsModel
{
public IList<State> State { get; set; }
public IList<Country> Country { get; set; }
public IList<AccountType> AccountTypes { get; set; }
public IList<AddressSource> AddressSources { get; set; }
public IList<StopCode> StopCodes { get; set; }
public State state { get; set; }
public Country country { get; set; }
public AccountType accountType { get; set; }
public AddressSource addressSource { get; set; }
public StopCode stopCode { get; set; }
}
控制器方法(获取)
public ActionResult Edit(string ConfigName)
{
ConfigurableItemsClient client = new ConfigurableItemsClient();
ConfigurableItemsModel configItemsModel = new ConfigurableItemsModel();
List<ConfigurableItemsModel> configItemsModelList = new List<ConfigurableItemsModel>();
switch (ConfigName)
{
case "Country":
List<Country> countryList = new List<Country>();
countryList = client.GetAllCountries().ToList();
int count = countryList.Count;
for (int i = 0; i < count; i++)
{
configItemsModel.Country = new List<Country>();
configItemsModel.Country = countryList;
}
configItemsModelList.Add(configItemsModel);
TempData["temporaryCountry"] = configItemsModel;
ViewBag.NoOfTimes = count;
ViewBag.ConfigItem = "Country";
return View(configItemsModelList);
break;
case "State":
List<State> stateList = new List<State>();
stateList = client.GetAllStates().ToList();
configItemsModelList.Clear();
for (int i = 0; i < stateList.Count; i++)
{
configItemsModel.State = new List<State>();
configItemsModel.State = stateList;
}
configItemsModelList.Add(configItemsModel);
ViewBag.NoOfTimes = stateList.Count;
ViewBag.ConfigItem = "State";
return View(configItemsModelList);
break;
case "Account Type":
List<AccountType> accountTypeList = new List<AccountType>();
accountTypeList = client.GetAllAccountType().ToList();
configItemsModelList.Clear();
for (int i = 0; i < accountTypeList.Count; i++)
{
configItemsModel.AccountTypes = new List<AccountType>();
configItemsModel.AccountTypes = accountTypeList;
}
configItemsModelList.Add(configItemsModel);
ViewBag.NoOfTimes = accountTypeList.Count;
ViewBag.ConfigItem = "AccountType";
return View(configItemsModelList);
break;
case "Stop Code" :
List<StopCode> stopCodeList = new List<StopCode>();
stopCodeList = client.GetAllStopCodes().ToList();
configItemsModelList.Clear();
for (int i = 0; i < stopCodeList.Count; i++)
{
configItemsModel.StopCodes = new List<StopCode>();
configItemsModel.StopCodes = stopCodeList;
}
configItemsModelList.Add(configItemsModel);
ViewBag.NoOfTimes = stopCodeList.Count;
ViewBag.ConfigItem = "StopCode";
return View(configItemsModelList);
break;
case "Address Source":
List<AddressSource> addressSourceList = new List<AddressSource>();
addressSourceList = client.GetAllAddressSources().ToList();
configItemsModelList.Clear();
for (int i = 0; i < addressSourceList.Count; i++)
{
configItemsModel.AddressSources = new List<AddressSource>();
configItemsModel.AddressSources = addressSourceList;
}
configItemsModelList.Add(configItemsModel);
ViewBag.NoOfTimes = addressSourceList.Count;
ViewBag.ConfigItem = "AddressSource";
return View(configItemsModelList);
break;
}
return View();
}
控制器方法(发布)
[HttpPost]
public ActionResult Edit(ConfigurableItemsModel modelFromView, string EditViewButton)
{
ConfigurableItemsClient client = new ConfigurableItemsClient();
switch (EditViewButton)
{
case "Add":
return View();
break;
case "Edit":
return View();
break;
case "Save":
//if(ViewBag.ConfigItem == "Country")
//{
int i = 0;
Country NewCountry = new Country();
NewCountry.CountryId = modelFromView.Country[i].CountryId;
NewCountry.CountryCode = modelFromView.Country[i].CountryCode;
NewCountry.CountryName = modelFromView.Country[i].CountryName;
NewCountry.WorkStationId = 1;
NewCountry.CreatedBy = 1;
NewCountry.CreatedOn = DateTime.Now;
NewCountry.ModifiedBy = 1;
NewCountry.ModifiedOn = DateTime.Now;
client.AddNewCountry(NewCountry);
//}
return View(modelFromView.Country);
break;
}
return View();
}
查看页面
@model IEnumerable<Models.ConfigurableItemsModel>
@{
ViewBag.Title = "Edit";
}
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Country</legend>
@if (ViewBag.ConfigItem == "Country")
{
<h2>Country</h2>
int k = 0;
<table>
<tr>
<th>
<label>Select</label>
</th>
<th>
@Html.DisplayNameFor(model => model.Country[k].CountryId)
</th>
<th>
@Html.DisplayNameFor(model => model.Country[k].CountryName)
</th>
<th>
@Html.DisplayNameFor(model => model.Country[k].CountryCode)
</th>
</tr>
@foreach (var item in Model)
{
for (int j = 0; j < item.Country.Count; j++)
{
<tr>
<th>
<input type="checkbox" name="chkCountry" /></th>
<th>
@Html.EditorFor(model => item.Country[j].CountryId)
</th>
<th>
@Html.EditorFor(model => item.Country[j].CountryName)
</th>
<th>
@Html.EditorFor(model => item.Country[j].CountryCode)
</th>
</tr>
}
}
</table>
<input type="submit" value="Save" name="EditViewButton" />
}
</fieldset>
}
@if (ViewBag.ConfigItem == "State")
{
<h2>State</h2>
int k = 0;
<table>
<tr>
<th>
<label>Select</label>
</th>
<th>
@Html.DisplayNameFor(model => model.State[k].StateId)
</th>
<th>
@Html.DisplayNameFor(model => model.State[k].CountryId)
</th>
<th>
@Html.DisplayNameFor(model => model.State[k].StateName)
</th>
</tr>
@foreach (var item in Model)
{
for (int i = 0; i < ViewBag.NoOfTimes; i++)
{
<tr>
<th>
<input type="checkbox" name="chkState" /></th>
<th>
@Html.DisplayFor(model => item.State[i].StateId)
</th>
<th>
@Html.DisplayFor(model => item.State[i].CountryId)
</th>
<th>
@Html.DisplayFor(model => item.State[i].StateName)
</th>
</tr>
}
}
</table>
}
@if (ViewBag.ConfigItem == "AddressSource")
{
<h2>Address Source</h2>
int k = 0;
<table>
<tr>
<th>
<label>Select</label>
</th>
<th>
@Html.DisplayNameFor(model => model.AddressSources[k].Value)
</th>
<th>
@Html.DisplayNameFor(model => model.AddressSources[k].ValueDescription)
</th>
<th>
@Html.DisplayNameFor(model => model.AddressSources[k].DisplayOrder)
</th>
<th>
@Html.DisplayNameFor(model => model.AddressSources[k].IsActive)
</th>
</tr>
@foreach (var item in Model)
{
for (int i = 0; i < ViewBag.NoOfTimes; i++)
{
<tr>
<th>
<input type="checkbox" name="chkAddressSource" /></th>
<th>
@Html.DisplayFor(model => item.AddressSources[i].Value)
@Html.HiddenFor(model => item.AddressSources[i].Value)
</th>
<th>
@Html.DisplayFor(model => item.AddressSources[i].ValueDescription)
@Html.HiddenFor(model => item.AddressSources[i].ValueDescription)
</th>
<th>
@Html.DisplayFor(model => item.AddressSources[i].DisplayOrder)
@Html.HiddenFor(model => item.AddressSources[i].DisplayOrder)
</th>
<th>
@Html.DisplayFor(model => item.AddressSources[i].IsActive)
@Html.HiddenFor(model => item.AddressSources[i].IsActive)
</th>
</tr>
}
}
</table>
}
@if (ViewBag.ConfigItem == "AccountType")
{
<h2>Account Type</h2>
int k = 0;
<table>
<tr>
<th>
<label>Select</label>
</th>
<th>
@Html.DisplayNameFor(model => model.AccountTypes[k].Value)
</th>
<th>
@Html.DisplayNameFor(model => model.AccountTypes[k].ValueDescription)
</th>
<th>
@Html.DisplayNameFor(model => model.AccountTypes[k].DisplayOrder)
</th>
<th>
@Html.DisplayNameFor(model => model.AccountTypes[k].IsActive)
</th>
</tr>
@foreach (var item in Model)
{
for (int i = 0; i < ViewBag.NoOfTimes; i++)
{
<tr>
<th>
<input type="checkbox" name="chkAccountType" /></th>
<th>
@Html.DisplayFor(model => item.AccountTypes[i].Value)
</th>
<th>
@Html.DisplayFor(model => item.AccountTypes[i].ValueDescription)
</th>
<th>
@Html.DisplayFor(model => item.AccountTypes[i].DisplayOrder)
</th>
<th>
@Html.DisplayFor(model => item.AccountTypes[i].IsActive)
</th>
</tr>
}
}
</table>
}
@if (ViewBag.ConfigItem == "StopCode")
{
<h2>Stop Code</h2>
int k = 0;
<table>
<tr>
<th>
<label>Select</label>
</th>
<th>
@Html.DisplayNameFor(model => model.StopCodes[k].Code)
</th>
<th>
@Html.DisplayNameFor(model => model.StopCodes[k].StopCodeName)
</th>
<th>
@Html.DisplayNameFor(model => model.StopCodes[k].StopCodeDescription)
</th>
<th>
@Html.DisplayNameFor(model => model.StopCodes[k].IsActive)
</th>
</tr>
@foreach (var item in Model)
{
for (int i = 0; i < ViewBag.NoOfTimes; i++)
{
<tr>
<th>
<input type="checkbox" name="chkStopCode" /></th>
<th>
@Html.DisplayFor(model => item.StopCodes[i].Code)
@Html.EditorFor(model => item.StopCodes[i].Code)
</th>
<th>
@Html.DisplayFor(model => item.StopCodes[i].StopCodeName)
@Html.EditorFor(model => item.StopCodes[i].StopCodeName)
</th>
<th>
@Html.DisplayFor(model => item.StopCodes[i].StopCodeDescription)
@Html.EditorFor(model => item.StopCodes[i].StopCodeDescription)
</th>
<th>
@Html.DisplayFor(model => item.StopCodes[i].IsActive)
@Html.EditorFor(model => item.StopCodes[i].IsActive)
</th>
</tr>
}
}
</table>
}
<table>
<tr>
<th>
<input type="submit" value="Delete" name="EditViewButton" />
</th>
<th>
<input type="submit" value="De-Activate" name="EditViewButton" />
</th>
<th>
@using (Html.BeginForm("Index", "ConfigurableItems", FormMethod.Get))
{
<input type="submit" value="Cancel" />
}
</th>
<th>
<input type="submit" value="Add" name="EditViewButton" />
</th>
<th>
<input type="submit" value="Edit" name="EditViewButton" />
</th>
<th>
<input type="submit" value="Save" name="EditViewButton" />
</th>
</tr>
</table>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
当我点击国家/地区下的Save
按钮时,我可以看到国家/地区相关值和EditViewButton
正在请求中传递,但它未显示在Controller操作HTTPPOST {{1}中} 方法。
我坚持这个问题两天了,谷歌没有多大帮助。感谢你的帮助。
答案 0 :(得分:0)
问题是您的输入字段不尊重用于绑定到列表的naming convention
。原因是因为您使用foreach
外循环而不是for
循环。
解决此问题的方法是将您的视图强烈输入到索引集合(例如IList<T>
或T[]
):
@model IList<Models.ConfigurableItemsModel>
然后将foreach
循环替换为for
循环:
@for (var i = 0; i < Model.Count; i++)
{
for (int j = 0; j < Model[i].Country.Count; j++)
{
<tr>
<th>
<input type="checkbox" name="chkCountry" />
</th>
<th>
@Html.EditorFor(model => model[i].Country[j].CountryId)
</th>
<th>
@Html.EditorFor(model => model[i].Country[j].CountryName)
</th>
<th>
@Html.EditorFor(model => model[i].Country[j].CountryCode)
</th>
</tr>
}
}
现在,当您查看生成的标记,更具体地说是输入字段的名称时,您会注意到它们的名称正确。例如,您将看到:
<input type="text" name="[1].Country[2].CountryId" value="123" />
而不是你现在拥有的,哪个是错的:
<input type="text" name="Country[2].CountryId" value="123" />
答案 1 :(得分:0)
您无法将任何值列表从视图发布到控制器。
您需要使用ModelBinder并设置为Global.asax Application_Start()
protected void Application_Start()
{
System.Web.Mvc.ModelBinders.Binders.Add(typeof(ConfigurableItemsModel), new ConfigurableItemsModelBinder());
}
现在获取一个类“ConfigurableItemsModelBinder”实现“IModelBinder”并使用视图中的值绑定模型。
public class ConfigurableItemsModelBinder: IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
List<Models.ConfigurableItemsModel> listModel=new List<Models.ConfigurableItemsModel>();
for(int i=0;i<listModel.Count;i++)
{
//now get the value from view with the control name of view page.
string CountryId=Convert.ToString(bindingContext.ValueProvider.GetValue(Country[i].CountryId).AttemptedValue) //Country[i].CountryId it is the control name(dynamic) which your View HTML actually rendered.
// now put the CountryId into the model.
Country[i].CountryId=CountryId;
}
}
}
控制器:您需要将模型列表传递给控制器
[HttpPost]
public ActionResult Index(IEnumirable<ConfigurableItemsModel> model,string EditViewButton)
{
Return View();
}