我有一个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和清单......我不知道问题出在哪里?
感谢所有人阅读并试图理解这一点,如果你想了解更多信息,请告诉我。
答案 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。它解释了类似于这个问题的内容。