C# 编写razor表单的正确方法是什么,以便模型正确绑定到表单POST?
我有时发现自己在为以下表格编写razor:C# 编写razor表单的正确方法是什么,以便模型正确绑定到表单POST?,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我有时发现自己在为以下表格编写razor: <h2>Subscription form for @Model.UserName</h2> @using (Html.BeginForm("Subscribe", "Subscribe", FormMethod.Post) { @Html.Partial("CreditCardForm", Model.PaymentInfo) @Html.LabelFor(m => m.PaymentInfo.PromoCo
<h2>Subscription form for @Model.UserName</h2>
@using (Html.BeginForm("Subscribe", "Subscribe", FormMethod.Post)
{
@Html.Partial("CreditCardForm", Model.PaymentInfo)
@Html.LabelFor(m => m.PaymentInfo.PromoCode)
@Html.EditorFor(m => m.PaymentInfo.PromoCode, new{Name="PromoCode"})
<button type=submit>Submit</button>
}
<h2>Update Credit Card form for @Model.UserName</h2>
@using (Html.BeginForm("UpdateCreditCard", "Subscribe", FormMethod.Post)
{
@Html.Partial("CreditCardForm", Model.PaymentInfo)
<button type=submit>Submit</button>
}
[HttpPost]
public ActionResult Subscribe(PaymentInfo paymentInfo)
{
...
}
这对我来说一直都像是一种黑客行为——有没有更好/正确的方法来做到这一点?你可以将促销代码排除在PaymentInfo模式之外。根据MVC标准,更标准
public class SubscribeModel
{
public string UserName {get;set;}
public string PromoCode {get;set;}
public PaymentInfo PaymentInfo {get;set;}
}
public class UpdateCreditCardModel
{
public PaymentInfo PaymentInfo {get;set;}
}
public class PaymentInfo
{
//Payment Info Properties goes here.
}
订户视图
<h2>Subscription form for @Model.UserName</h2>
@using (Html.BeginForm("Subscribe", "Subscribe", FormMethod.Post)
{
@Html.Partial("CreditCardForm", Model.PaymentInfo)
@Html.LabelFor(m => m.PromoCode)
@Html.EditorFor(m => m.PromoCode)
<button type=submit>Submit</button>
}
是的,这是一个黑客。您完全是在与框架作斗争,框架提供了实现您想要做的事情的机制。他们被称为编辑模板 Partials和EditorTemplates是相似的,但是只有EditorTemplates创建正确的表单名称来自动支持模型绑定。Partials没有,至少在您使用它们的方式上没有
将部分转换为EditorTemplate,然后在post操作中仅接受父模型。您不应尝试覆盖
名称
属性。您回发了在视图中使用的模型,而不是模型的属性(但是您使用的Html.Partial()
也不正确-正确的用法是EditorTempate
),并且它不会生成“PaymentInfo\u PromoCode的默认名称”-默认值是name=“PaymentInfo.PromoCode”
@StephenMuecke如果有其他数据要显示在包含不需要的表单或表单帖子的页面上,会发生什么情况?我们总是要回发视图中使用的模型,这似乎有点限制。@StephenMuecke:在这种情况下,使用分部模板和编辑器模板有什么区别?一如既往,使用表示要在视图中显示/编辑的内容的视图模型。
[HttpPost]
public ActionResult Subscribe(SubscribeModel model)
{
//Access model.Promocode and model.PaymentInfo here.
}
[HttpPost]
public ActionResult UpdateCreditCard(UpdateCreditCardModel model)
{
//Access model.PaymentInfo here.
}