MVC 4回发空视图模型
本文关键字:视图 模型 4回 MVC | 更新日期: 2023-09-27 18:18:12
关于这个有很多问题,但我似乎不能让它工作。应该很简单,但我却摸不着头脑。
控制器:
[HttpPost]
public ActionResult Edit(BookingIndexViewModel vm) // Also tried BookingViewModel
{
return View();
}
容器视图模型:
public class BookingIndexViewModel
{
public int id { get; set; }
public List<BookingViewModel> bookings { get; set; }
public List<SelectListItem> allAttendances { get; set; }
}
预订视图模型(我实际感兴趣的虚拟机)
public class BookingViewModel
{
public int id { get; set; }
public int referralId { get; set; }
public int attendanceId { get; set; }
}
@model Project.ViewModels.BookingIndexViewModel
@using Project.ViewModels
<fieldset>
<legend>Registered patients</legend>
@if (Model.bookings.Count < 1)
{
<div>None currently registered</div>
}
else
{
<table>
<tr>
<th>
<span class="display-label">@Html.LabelFor(model => model.bookings[0].forenames)</span>
</th>
<th>
<span class="display-label">@Html.LabelFor(model => model.bookings[0].surname)</span>
</th>
<th>
<span class="display-label">@Html.LabelFor(model => model.bookings[0].dob)</span>
</th>
<th>
<span class="display-label">@Html.LabelFor(model => model.bookings[0].attendance</span>
</th>
</tr>
@{
foreach (BookingViewModel b in Model.bookings)
{
using (Html.BeginForm("Edit", "Booking"))
{
@Html.HiddenFor(x => x.id)
<tr>
<td>
<span class="display-field">@b.forenames</span>
</td>
<td>
<span class="display-field">@b.surname</span>
</td>
<td>
<span class="display-field">@String.Format("{0:dd/MM/yyyy}", b.dob)</span>
</td>
<td>
@Html.DropDownListFor(model => b.attendanceStatusId, Model.allAttendances)
</td>
<td>
<input type="submit" value="Save" />
</td>
</tr>
}
}
}
</table>
}
</fieldset>
因此视图接受容器视图模型BookingIndexViewModel
并为每个持有的BookingViewModel
创建一个表单。提交时,我希望它通过修改后的BookingViewModel
返回容器视图模型,但它总是空的。我也试着期待用相同的结果修改的单个BookingViewModel
。MVC是否提交与给定视图类型或从表单块中推断的类型相同类型的水合视图模型?
我从视图中检索到的唯一重要值是修改后的attendanceId
(应该由下拉帮助器填充)和预订id。
这个问题几乎肯定与你如何呈现这个
有关foreach (BookingViewModel b in Model.bookings)
{
@Html.HiddenFor(x => x.id);
...
@Html.DropDownListFor(model => b.attendanceStatusId, Model.allAttendances)
}
上面的HTML看起来像
<form ... >
<input type="hidden" name="BookingIndexViewModel.id" ... />
<select name="BookingViewModel.attendanceStatusId" ... />
</form>
...
<form ... >
<input type="hidden" name="BookingIndexViewModel.id" ... />
<select name="BookingViewModel.attendanceStatusId" ... />
</form>
...
MVC模型绑定器使用name
字段将数据绑定到目标模型,在您的场景中,您有BookingIndexViewModel
,您应该发现的是至少您的id
字段被填充,但您的List<BookingViewModel>
肯定是空的。
不完全清楚你要做什么,我怀疑你想要的是显示整个预订信息,但只发布一个单独的BookingViewModel
回来?如果是这种情况,下面的代码应该可以工作
[HttpPost]
public ActionResult Edit(BookingViewModel model)
{
...
}
<<p> 视图/strong> foreach (BookingViewModel b in Model.bookings)
{
using (Html.BeginForm("Edit", "Booking"))
{
@Html.HiddenFor(b => b.id);
@Html.HiddenFor(b => b.referralId);
@Html.DropDownListFor(b => b.attendanceId, Model.allAttendances)
}
}
在我看来你应该知道模型绑定在asp中是如何工作的。MVC,这是一个很好的链接,给出了详细的asp。MVC模型绑定http://msdn.microsoft.com/en-us/magazine/hh781022.aspx虽然文章很长,但它将帮助您了解模型绑定是如何工作的
与此同时,您应该查看您的HTML页面,以了解您的HTML控件如何命名
在ASP中没有"回发"。净MVC。它像HTTP一样是无状态的。如果你想提交一些东西给服务器,你必须把它包含在表单中。
我不认为这是一个好主意传递对象的整个列表从视图模型回服务器。你有一个Edit
动作。将其参数类型更改为BookingViewModel
。这将允许您编辑单个预订项目。然后在表单中添加@Html.HiddenFor(x => x.referralId)
。
MVC实际上并没有提交任何特别的东西,也不知道您期望的ViewModel
被提交给Action。它不会像"viewstate"那样重新发布你的ViewModel
。
最终,它只是在表单中发布html中的任何输入元素,而Action方法,当被调用时,尝试从POST中包含的值中提取(使用绑定器)任何你声明为参数的东西。
在您的情况下,似乎您只会提交一个隐藏的Id和 attendatusid 。如果你看一下浏览器的实际网络流量,你会注意到这就是被发布的内容。
因此,你的Action应该期待一个不同的ViewModel,它有两个属性来匹配那些输入字段的名称。
在看了一个类似的问题后,我使用for(){}
尝试而不是foreach(){}
,现在它工作了。我认为这与每种循环类型中元素的可变性有关