1

我有这样一个模型的 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)(PS:一些代码已被剥离并替换为注释代码)

@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 中看到)调用控制器的方法,但在此方法中,所有模型都是空的:ID 和列表。 ..我不知道问题出在哪里?

感谢大家阅读并尝试理解这一点,如果您想了解更多信息,请告诉我。

4

1 回答 1

0

MyId应该使用您现有的代码正确接收。

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

你能做的最远的事情是给一系列输入元素同名,即几个元素喜欢<input name='categories' ...>并在一个数组参数中接收它,string[] categories或者一个具有类似属性的模型string[] Categories {get;set;}

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

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

有关替代方案,请参阅我对此问题的回答。它解释了类似于这个问题的东西。

于 2013-07-11T10:17:00.757 回答