我在MakePayment.cshmtl视图中获取模型中的数据时遇到问题。
AccountScreen.cshtml正在调用MakePayment.cshtml视图:
@model SuburbanCustPortal.SuburbanService.CustomerData
@{
ViewBag.Title = "Account Screen";
}
<h2>AccountScreen</h2>
<div class="leftdiv">
<fieldset>
<legend>customer info</legend>
@Html.Partial("CustomerInfoPartialView", Model)
</fieldset>
<fieldset>
<legend>delivery address</legend>
@Html.Partial("DeliveryAddressPartialView", Model)
</fieldset>
<fieldset>
<legend>delivery info</legend>
@Html.Partial("DeliveryInfoPartialView", Model)
</fieldset>
</div>
<div class="rightdiv">
<fieldset>
<legend>balance</legend>
<div>
@Html.Partial("BalancePartialView", Model)
</div>
</fieldset>
<fieldset>
<legend>payment</legend>
<div>
@Html.Partial("MakePayment", Model)
</div>
</fieldset>
<fieldset>
<legend>billing info</legend>
<div>
@Html.Partial("BillingInfoPartialView", Model)
</div>
</fieldset>
</div>
我的MakePayment.cshtml视图:
@model SuburbanCustPortal.SuburbanService.CustomerData
@using (Html.BeginForm("MakePayment2", "Customer", FormMethod.Post))
{
<div style="text-align:center;">
<input class="makePaymentInput" type="submit" value="Make a Payment" />
</div>
}
我的CustomerController:
public ActionResult AccountScreen(LogOnModel model)
{
return ShowCustomer(model.AccountNumber);
}
public ActionResult MakePayment(CustomerData model)
{
return View("MakePayment", model);
}
[HttpPost]
public ActionResult MakePayment2(CustomerData model)
{
//CustomerData model = new CustomerData();
var newmodel = new PaymentModel.SendToGateway();
newmodel.AccountBalance = model.TotalBalance;
newmodel.Amount = model.TotalBalance;
return RedirectToAction("PrePayment", "Payment", newmodel);
}
永远无法联系到public ActionResult MakePayment(CustomerData model)
。
我的问题:正在联系[HttpPost] public ActionResult MakePayment2(CustomerData model)
,但模型中有空值。
我知道正在填充AccountScreen的数据初始模型,因为正在呈现的其他视图正在显示数据。
任何人都能看到我做错了什么?
答案 0 :(得分:2)
问题是除了提交按钮之外,表单中没有任何内容。您需要确保输入字段(文本框,选择列表或隐藏字段),因为这些是将数据发布回控制器的内容。
您可以尝试在局部视图中使用EditorForModel
:
@using (Html.BeginForm("MakePayment2", "Customer", FormMethod.Post))
{
@Html.EditorForModel()
<div style="text-align:center;">
<input class="makePaymentInput" type="submit" value="Make a Payment" />
</div>
}
根据评论进行修改
Razor不包含Html.HiddenForModel()
方法,无论出于何种原因。可能的解决方法:
Html.HiddenFor(model => model.Property)
\[HiddenInput\]
EditorForModel()
但请将其包装在<div style="display: none;"></div>
中(请注意,恶意用户仍然可以修改属性,就像它们可见一样。)Html.HiddenFor(model => model.id)
and fetch the model in the controller. 相关问题:
答案 1 :(得分:2)
问题是,您正在创建一个只包含提交按钮的表单。
当你提交它时,它不会向服务器发回任何内容,因此你的函数会收到一个空模型。
@using (Html.BeginForm("MakePayment2", "Customer", FormMethod.Post))
{
<div style="text-align:center;">
<input class="makePaymentInput" type="submit" value="Make a Payment" />
</div>
}
这翻译为:
<form method="POST" action="{url}">
<div style="text-align:center;">
<input class="makePaymentInput" type="submit" value="Make a Payment" />
</div>
</form>
更多详情:
由于在逻辑中您然后重定向到新页面以收集付款信息,您不希望让用户有机会弄乱与您的模型,因此您应该查询您的客户数据从您的上下文而不是信任POST中提交的内容。
因此,如果这样你真的需要添加:
@using (Html.BeginForm("MakePayment2", "Customer", FormMethod.Post))
{
@Html.HiddenFor(model => model.{ID Field})
<div style="text-align:center;">
<input class="makePaymentInput" type="submit" value="Make a Payment" />
</div>
}
这样,您就可以在服务器端代码中恢复模型了。
答案 2 :(得分:0)
基本上,您的表单不提交任何内容,因为表单范围内没有输入字段。尝试将AccountScreen.cshtml
中的所有html包装在@using (Html.BeginForm(
语句中(并将其从MakePayment.cshtml
中删除)。