【发布时间】:2016-12-09 14:35:48
【问题描述】:
我很确定我的大脑是朋友,这是我明天早上要笑的事情,但不幸的是我被困在这部分并寻求帮助。
我有一个 ViewModel:
public class HousingDetailsViewModel : AppViewModel
{
DataContext db = new DataContext();
public List<string> units { get; set; }
public List<AvailableHousing> availableHousings { get; set; }
public Person person { get; set; }
public OccupiedHousing currentHousing { get; set; }
public OccupiedHousing newHousing;
public HousingDetailsViewModel(int? id)
{
units = db.AvailableHousings.OrderBy(ah => ah.Unit).Select(h => h.Unit).Distinct().ToList();
availableHousings = db.AvailableHousings.Where(h => h.Available == true).OrderBy(h => h.Bed)
.OrderBy(h => h.Room).ToList();
currentHousing = db.OccupiedHousing.Include(o => o.AvailableHousing)
.Include(o => o.Person).Where(o => o.PersonID == id && o.CurrentHousing == true).FirstOrDefault();
person = db.Persons.Find(id);
newHousing = new OccupiedHousing();
}
}
这个视图的控制器方法:
public ActionResult Details(int? id)
{
return View(new HousingDetailsViewModel(id));
}
[HttpPost]
public ActionResult Move(OccupiedHousing newHousing, int? personID)
{
newHousing.PersonID = personID;
newHousing.DateArrived = DateTime.Now;
newHousing.CurrentHousing = true;
newHousing.AvailableHousingID = housingID;
db.OccupiedHousings.Add(newHousing);
db.SaveChanges();
return RedirectToAction("Index", new HousingViewModel());
}
我的表单对我的所有字段都很好,除了 1,这就是 AvailableHousingID。我试过设置一个隐藏的值。我在设置隐藏字段的值的地方放置了一个断点,我观察它的变化,但它没有到达控制器。所以我将其更改为表单提交并尝试将其作为路由值捕获,但这也不起作用。我很茫然,谁能看到我哪里出错了?
编辑:添加视图
@model AppName.ViewModels.HousingDetailsViewModel
@{
ViewBag.Title = "Housing Details";
}
@Html.BeginForm("Move", "Housing", new { personID = @Model.person.ID }, FormMethod.Post, new { })
<script>
function setID(id) {
$('#HiddenHousingID').val(id);
$('#HiddenSubmit').click();
}
</script>
<h2>Housing Details</h2>
<div class="row">
<div class="col-xs-12 container">
<div class="col-xs-5">
<img src="//placehold.it/150x200/77CCDD/66BBCC" class="img-responsive" />
</div>
<div class="col-xs-7">
<h4>@Model.person.ComboName</h4>
<h4>@Model.currentHousing.AvailableHousing.Unit - @Model.currentHousing.AvailableHousing.Room - @Model.currentHousing.AvailableHousing.Bed</h4>
<h4>@Model.person.DateOfBirth.Value.ToShortDateString()</h4>
@Html.HiddenFor(m => m.newHousing.AvailableHousingID, new { id = "HiddenHousingID", name = "newHousing.AvailableHousingID")}
</div>
</div>
</div>
<div class="row">
@foreach (var unit in Model.units)
{
<div class="col-xs-6">
<div class="panel panel-primary">
<div class="panel-heading">
<span class="panel-title">
@unit
</span>
</div>
<div class="panel-body">
<table id="MoveHousingTable" class="table table table-condensed table-striped">
<thead>
<tr>
<th>
Available Housing
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var housing in Model.availableHousings.Where(h => h.Unit == unit))
{
<tr>
<td>
@housing.Room -
@housing.Bed
</td>
<td>
<input type="button" value="Select" name="select" onclick="setID(@housing.ID)" />
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
}
</div>
<input type="submit" class="hidden" id="HiddenSubmit">
}
【问题讨论】:
-
能不能也分享一下观点
-
(1) 视图模型不应该包含数据库访问代码 (2) 视图模型在编辑时不应该包含数据模型。 (3) 您将
HousingDetailsViewModel传递给视图,因此您的 post 方法需要为public ActionResult Move(HousingDetailsViewModel model)(4) 您似乎没有无参数构造函数,因此一旦您修复了第 3 点,DefaultModelBinder将引发异常跨度> -
@Usman,我已更新以显示视图。我展示了 BeginForm 的使用,其中我不使用 HousingID 参数作为 Move 方法。我想我应该把它从上面拿出来。
-
@StephenMuecke,感谢您提供的信息。我只是从 WebForms 迁移到 MVC,这就是我被指示的方式。现在我知道了,我将致力于将访问代码移动到模型中。但是,我确实将 Move 方法中的 OccupiedHousing 类型更改为 ViewModel,并向 ViewModel 添加了一个无参数构造函数,这是同样的问题。
-
您的视图没有任何意义(您甚至没有任何可编辑的控件),但在 POST 方法中
model.newHousing.AvailableHousingID将包含您脚本设置的值。
标签: c# asp.net-mvc