【问题标题】:Controller action method's model parameter is empty when form submit表单提交时控制器动作方法的模型参数为空
【发布时间】:2014-12-21 15:53:06
【问题描述】:

我在电影控制器中有一个动作方法 ReleasingTheaters,ReleasingTheaters 有两个重载一个是 httpGet,它接受电影 ID 并做一些事情并返回接受 ViewModel 对象的 ReleasingTheaters 视图。当我提交表单时,在 ReleasingTheaters 视图上点击提交按钮,控制器的另一个 http Post 操作方法 ReleasingTheaters 接受 viewModel 并将模型数据保存到数据库。

这是我的视图模型:

 public class MovieReleasingTheatersViewModel
 {
    public MovieReleasingTheatersViewModel()
    {
        AvailableStates = new List<SelectListItem>();
        AvailableCities = new List<SelectListItem>();
        AvailableLocations = new List<SelectListItem>();
        ReleasingTheaters = new List<MovieReleasingTheaterModel>();
    }

    [Display(Name="State")]
    public int? StateId { get; set; }  
    public IList<SelectListItem> AvailableStates { get; set; }
    [Display(Name = "City")]
    public int? CityId { get; set; }
    public IList<SelectListItem> AvailableCities { get; set; }
    public int? LocationId { get; set; }
    public IList<SelectListItem> AvailableLocations { get; set; }
    public IList<MovieReleasingTheaterModel> ReleasingTheaters { get; set; }
}

这是我的控制:

    [HttpGet]
    public ActionResult ReleasingTheaters(int id)
    {
        var model = new MovieReleasingTheatersViewModel();

        model = PrepareMovieReleasingTheaterModel(0, 0, 0, id);

        return View(model);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ReleasingTheaters(MovieReleasingTheatersViewModel model)
    {
        // iterate through the model's collection and save or update database
        return View("Index");
    }

这是我的 ReleasingTheaters 视图:

 @model Bookmany.Admin.Models.Movie.MovieReleasingTheatersViewModel

 @{
     ViewBag.Title = "Releasing Theaters";
  }

<h3>Releasing Theaters</h3>

@using (Html.BeginForm())
{
 @Html.AntiForgeryToken()
 <table class="table">
    <tr>
        <th>

            @Html.DropDownListFor(model => model.StateId, Model.AvailableStates, "Select  State")

        </th>
        <th>
            @Html.DropDownListFor(model => model.CityId, Model.AvailableCities, "Select City")
        </th>
        <th>
            @Html.DropDownListFor(model => model.LocationId, Model.AvailableLocations, "Select Location")
        </th>

        <th></th>
    </tr>
</table>

<table class="table">
<thead class="t_head">
    <tr>
        <th>
            Theater
        </th>
        <th>
            Date From
        </th>
        <th>
            Date To
        </th>
        <th>
            Release
        </th>
        <th></th>
    </tr>
</thead>
<tbody class="t_body">
    @foreach (var item in Model.ReleasingTheaters)
    {
        <tr>
            <td>

                @Html.DisplayFor(modelItem => item.TheaterName)
            </td>
            <td>
                @Html.TextBoxFor(modelItem => item.DateFrom, new { id = "DateFrom" })
            </td>
            <td>
                @Html.TextBoxFor(modelItem => item.DateTo, new { id = "DateTo" })
            </td>
            <td>
                @Html.EditorFor(modelItem => item.IsTheaterChecked)
            </td>
        </tr>
    }
</tbody>
</table>
   <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div> 
    }

我的问题:

当我单击提交按钮时,动作方法上的模型对象没有值,viewModel 对象的集合属性都是空的,我的代码有什么问题

如何在我的操作方法上获取模型对象值(集合),以便我可以将这些值保存或更新回我的数据库

【问题讨论】:

    标签: c# asp.net-mvc entity-framework


    【解决方案1】:

    您需要将foreach 更改为for 循环,以便正确命名控件并可以由DefaultModelBinder 绑定

    @for (int i = 0; i < Model.ReleasingTheaters.Count; i++)
    {
      @Html.TextBoxFor(m => m.ReleasingTheaters[i].DateFrom)
      ....
    }
    

    这将生成诸如

    之类的输入
    <input type="text" name="ReleasingTheaters[0].DateFrom" id="ReleasingTheaters_0__DateFrom" value="?" >
    <input type="text" name="ReleasingTheaters[1].DateFrom" id="ReleasingTheaters_1__DateFrom" value="?" >
    

    还请注意,您不应该将id 属性设置为new { id = "DateFrom" } 等。助手将呈现一个唯一的ID,但您正在创建重复的ID,这是无效的html

    【讨论】:

    • ,当我删除代码 new { id = "DateFrom" } 时,jquery Ui 数据选择器根本不会显示我将 DateFrom id 引用为: .那么如何引用控件来显示日期选择器呢?
    • 然后使用类名。 new { @class = "datepicker" }$(".datepicker").datepicker()(重复的 id 是无效的 html)
    • 如果AvailableCities 的列表依赖于AvailableStates 的选择,那么是的,返回JSON 以填充第二个下拉列表的ajax 是最好的方法(第三个下拉列表同上,尽管它返回表格的部分视图可能会更好)。 This answer 给出了一个使用 ajax 调用填充下拉列表的示例
    • @Mussammil,是的,这就是另一个答案中的代码正在做的事情(单击我最后评论中的链接)
    • DisplayFor 不会呈现回发的控件。您可以添加@Html.HiddenFor(m =&gt; m.ReleasingTheaters[i].TheaterName) 来创建隐藏输入或使用TextBoxFor 并添加new { @readonly="readonly" } 而不是DisplayFor()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2020-04-14
    相关资源
    最近更新 更多