Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编写razor表单的正确方法是什么,以便模型正确绑定到表单POST?_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 编写razor表单的正确方法是什么,以便模型正确绑定到表单POST?

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

我有时发现自己在为以下表格编写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.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.
    }