[英]MVC5 ViewModel Not Posting back to Controller
So, I have an issue with a controller/view/viewmodel. 所以,我有一个控制器/视图/视图模型的问题。 It's similar to this issue I think.
我认为它类似于这个问题 。 Basically, I have a viewmodel that I send to a view from my controller.
基本上,我有一个viewmodel,我发送到我的控制器的视图。 There are items that display and then some additional fields for the user to manipulate before the whole mess is sent back over to a controller post action.
在将整个混乱发送回控制器后期操作之前,有些项目会显示,然后是一些其他字段供用户操作。 When I get the data back in my post, all of the viewmodel is empty.
当我在帖子中获取数据时,所有viewmodel都是空的。
So, without further ado, here's some code to look at: 所以,不用多说了,这里有一些代码可供参考:
ViewModel: 视图模型:
public class ASideReceivingViewModel
{
public PurchaseOrderLine poLine;
public ReceivingItem receivingItem;
public Dictionary<string, string> TankerOrRailcarOptions { get; set; }
public ASideReceivingViewModel()
{
TankerOrRailcarOptions = new Dictionary<string, string>();
TankerOrRailcarOptions.Add("R", "Railcar");
TankerOrRailcarOptions.Add("T", "Tanker");
}
}
Controller Actions: 控制器动作:
public ActionResult Receive(string strOrdNo, short? shtLineNo)
{
//if there isn't a selected po line, then shoot them back to the first page
if (strOrdNo == null || !shtLineNo.HasValue) return RedirectToAction("Index");
PurchaseOrderService poService = new PurchaseOrderService();
ReceivingItemService s = new ReceivingItemService(p);
ASideReceivingViewModel vm = new ASideReceivingViewModel();
vm.poLine = poService.GetOpenPurchaseOrderLines().Where(po => po.Ord_no == strOrdNo &&
po.Line_no == shtLineNo).FirstOrDefault();
if (vm.poLine == null) return RedirectToAction("Index");
vm.receivingItem = s.CreateNewReceivingItem(vm.poLine);
return View(vm);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Receive(ASideReceivingViewModel mytestvm)
{
if (ModelState.IsValid && mytestvm.receivingItem != null)
{
ReceivingItemService s = new ReceivingItemService(p);
s.Update(mytestvm.receivingItem);
return RedirectToAction("Index");
}
return View(mytestvm);
}
View: 视图:
@model FSIApps.Presentation.Models.ASideReceivingViewModel
<div class="row">
@{Html.RenderPartial("POLineDetails", Model.poLine);}
</div>
@using (Html.BeginForm("Receive", "Receiving", FormMethod.Post))
{
@Html.HiddenFor(model => model.receivingItem.Id)
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="row">
@Html.AntiForgeryToken()
<div class="col-md-6">
<div class="form-group">
<label for="receivingItem_Batch_number">Batch Number</label>
@Html.TextBoxFor(model => model.receivingItem.Batch_number, new { @class = "form-control" })
<span class="help-block">*Also the Vendor Lot Number on the BOL</span>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="receivingItem_Qty_received">Qty Received</label>
@Html.TextBoxFor(model => model.receivingItem.Qty_received, new { @class = "form-control" })
<span class="help-block">*Qty shown on BOL</span>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="receivingItem_Carrier">Carrier</label>
@Html.TextBoxFor(model => model.receivingItem.Carrier, new { @class = "form-control" })
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="receivingItem_">Tanker or Railcar</label>
@Html.DropDownListFor(m => m.receivingItem.Tanker_or_railcar, new SelectList(Model.TankerOrRailcarOptions, "Key", "Value", Model.receivingItem.Tanker_or_railcar), new { @class = "form-control" })
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="receivingItem_Railcar_number">Railcar Number</label>
@Html.TextBoxFor(model => model.receivingItem.Railcar_number, new { @class = "form-control" })
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="receivingItem_Manifest_number">Manifest Number</label>
@Html.TextBoxFor(model => model.receivingItem.Manifest_number, new { @class = "form-control" })
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<input type="submit" value="Save" class="btn btn-success" />
</div>
</div>
</div>
</div>
</div>
}
I don't necessarily care about the data I send to the partial view, but when I post back the regular form I get nothing set in the ViewModel. 我不一定关心我发送到局部视图的数据,但是当我回发常规表单时,我在ViewModel中没有设置任何内容。 In the other post they talk about how that's an issue with naming the parameter sent back to the controller, but no combination of setting the value in my
@Html.BeginForm()
seems to do the trick. 在另一篇文章中,他们讨论了如何将发送回控制器的参数命名为一个问题,但是在
@Html.BeginForm()
中设置值的组合似乎没有。
Anyone have any advice for me here? 有人对我有什么建议吗?
Edited: 编辑:
To use the automatic model binding, you should use properties instead of fields in the view model. 要使用自动模型绑定,应使用属性而不是视图模型中的字段。 Hopefully this does the trick:
希望这可以解决问题:
public class ASideReceivingViewModel
{
public PurchaseOrderLine poLine { get; set; };
public ReceivingItem receivingItem { get; set; };
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.