(MVC4 - Razor)模型中的模型列表不会被post方法捕获

时间:2013-07-11 09:02:18

标签: c# asp.net-mvc asp.net-mvc-4 razor

我有一个MVC应用程序,其模型如下:

public class ListOfMyModel
{
    public List<MyModel> MyModels { get; set; }
    public Guid MyID { get; set; }
}

public class MyModel
{
    // Some code like :
    public string MyString { get; set; }
}

我的控制器中的post方法是这样的:

[HttpPost]
public ActionResult EditMe(ListOfModel myList)
{
    try
    {
        if (ModelState.IsValid)
        {
            List<MyModel> myModels = myList.MyModels;

            foreach (MyModel model in myModels)
                // Some code

            return RedirectToAction("Index");
        }
    catch
    {
        // Some code
        return View(myList)

    }
    return View(myList);
}

我的观点:(我使用的是Kendo UI)(P.S:一些代码已被删除并被评论代码取代)

@model MyApplication.Web.Models.ListOfMyModel
@{
ViewBag.Title = MyTitle;
Layout = "~/Views/Shared/_MyLayout.cshtml";
 }

<div class="span1"></div>
<div class="span8">
    <div id="list-wrapper">
        <div class="k-content">
            <form id="form" class="form-horizontal well span8 offset2" method="post" action="@Url.Action("EditMe")">

            <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
            <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
            <script src="@Url.Content("~/Scripts/jquery-1.9.1.min.js")" type="text/javascript"></script>
            <script src="@Url.Content("~/Scripts/kendo/2013.1.514/kendo.web.min.js")"></script>
            <script src="@Url.Content("~/Scripts/kendo/2013.1.514/kendo.aspnetmvc.min.js")"></script>

             <div class="offset2 span2">
                <fieldset>
                    <legend> My title </legend>
                    <p>Some code :</p>
                    @Html.HiddenFor(m => m.MyID)
                    @for (int i = 0; i < Model.MyModels.Count; i++)
                    {
                    // Some code
                    <div class="control-group">
                        <label class="control-label">MyText : </label>
                        <div class="controls">
                        @(Html.Kendo().DropDownListFor(c =>                 Model.MyModels[i].MyString)
                                        .DataTextField("Text")
                                        .DataValueField("Value")
                                        .DataSource(dataSource => dataSource 
                                            .Read(read => read.Action("GetSomeThings", "MyController"))
                                        )
                                        .Value(Model.MyModels[i].MyString)
                                    )
                         </div> 
                     </div>
                     }
                     <div class="form-actions"> 
                        <button type="submit" class="btn btn-primary">Validate</button>
                    </div> 
                 </fieldset>
              </div>
           </form>
        </div>
    </div>
 </div>

但问题是,当我在视图中按下提交按钮时,我的控制器的方法被调用所有预期的数据(在Chrome中看到)但在此方法中,所有模型都为null:ID和清单......我不知道问题出在哪里?

感谢所有人阅读并试图理解这一点,如果你想了解更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

应使用现有代码正确接收MyId

模型绑定器只能匹配名称在表单中具有匹配属性的输入值。即如果您有这样的输入<input name='bikes' ...>,那么您的模型应该具有属性Bikes,以便模型绑定器可以将值从输入传递到属性。在您的情况下,您使用没有匹配属性名称的动态名称创建输入。 (注意:参考您用作动作参数的模型。)

你能走的最远的是给出一系列相同名称的输入元素,即<input name='categories' ...>等几个元素,并在像string[] categories这样的数组参数中接收它,或者像{string[] Categories {get;set;}这样的属性接收它。 {1}}

简而言之,您必须重新设计模型和视图。如果您使用List<string>而不是List<MyModel>,并且视图的下拉列表具有固定名称,例如DropDownListFor(c => Model.MyModels,那么模型绑定器将填充MyModels属性使用每个下拉列表中选定字符串的列表。

提示:您可以在View中使用模型,并在Action中接收不同的模型(或一系列参数)。通过这种方式,您可以发送更多信息来呈现视图,并接收包含基本数据的帖子来处理用户输入。

See my answer to this question for alternatives。它解释了类似于这个问题的内容。