无法将模型从View传递给Controller。

时间:2013-03-13 06:44:31

标签: asp.net-mvc

我实际上在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}中} 方法。

我坚持这个问题两天了,谷歌没有多大帮助。感谢你的帮助。

2 个答案:

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