我有一个强类型视图,其中包含模型中的自定义对象列表。
在视图中,我显示列表中每个对象的文本框:
@using (Html.BeginForm("SaveData", "Localization", FormMethod.Post))
{
foreach (YB.LocalizationGlobalText m in Model.GlobalTexts)
{
@Html.Label(m.LocalizationGlobal.Name)
@Html.TextBoxFor(model => m.Text)
<br />
}
<input type="submit" value="Save" />
}
现在我如何从模型中的文本框中获取更新的数据。 我可以在formcollection中看到更新的数据:
[HttpPost]
public virtual ActionResult SaveData(FormCollection form)
{
// Get movie to update
return View();
}
form [“m.Text”] =“testnewdata1,testnewdata”
但是如何将其映射到模型,因此我有每个对象的更新值。 或者我怎样才能从formcollection中得到它,就像这样.. form [someid] [“m.Text”]
编辑:
我也尝试将模型作为参数传递,但模型数据为空。
[HttpPost]
public virtual ActionResult SaveData(LocalizationModel model, FormCollection form)
{
// Get movie to update
return View();
}
当我查看模型时:model.GlobalTexts = null
答案 0 :(得分:2)
[HttpPost]
public virtual ActionResult SaveData(int movieId, FormCollection form)
{
// Get movie to update
Movie movie = db.Movies.Where(x => x.Id == movieId);
// Update movie object with values from form collection.
TryUpdateModel(movie, form);
// Do model validation
if (!ModelState.IsValid)
return View();
return View("success");
}
修改看到这个问题,我问过一段时间:How to use multiple form elements in ASP.NET MVC
假设您有这样的观点:
@model IEnumerable<CustomObject>
@foreach (CustomObject customObject in Model)
{
<div>
@Html.TextBox(customObject.CustomProperty);
<!-- etc etc etc -->
</div>
}
像这样重写:
@model IEnumerable<CustomObject>
@for (int count = 0; count < Model.Count(); count++)
{
<div>
<!-- Add a place for the id to be stored. -->
@Html.HiddenFor(x => x[count].Id);
@Html.TextBoxFor(x => x[count].CustomProperty);
<!-- etc etc etc -->
</div>
}
现在在你的行动方法中这样做:
public virtual ActionResult SaveData(IEnumerable<CustomObject>)
{
// You now have a list of custom objects with their IDs intact.
}
如果你使用编辑器,那就更容易了,但是我会让你自己解决这些问题,因为它们非常简单。我链接的问题中接受的答案显示了一个例子。
注意:如果需要,可以将IList替换为IEnumerable。
答案 1 :(得分:0)
如果我理解你的问题,你可以简单地使用你的viewmodel作为SaveData的参数,它会自动映射它:
[HttpPost]
public virtual ActionResult SaveData(ViewModelType viewmodel)
{
// Get movie to update
return View();
}