MVC5 - 发布包含Html.Action的视图

时间:2016-09-21 13:48:11

标签: c# asp.net-mvc asp.net-mvc-partialview

我的申请需要CRUD合同,我可以为每份合同附上文件。 因此,在我的编辑/更新页面中,我有三种形式:

  • 一个更新合同属性(Edit.cshtml)
  • 一个将文档添加到合同中(AddDocument.cshtml)
  • 一个从合同中删除文件(无需显示)

它看起来像这样:

Edit.cshtml

sentence[]

AddDocument.cshtml

@model ContractViewModel
@Html.Action("AddDocument", "Contracts", new { id = Model.IdContract })
@Html.Action("RemoveDocument", "Contracts", new { id = Model.IdContract })
@using (Html.BeginForm("Edit", "Contracts", FormMethod.Post, new { @class = "form-horizontal", enctype = "multipart/form-data" }))
{
     @Html.AntiForgeryToken()
     @Html.ValidationSummary(true)
     @Html.HiddenFor(model => model.IdContract)
     <div class="form-group">
          @Html.LabelFor(model => model.ContractNumber, htmlAttributes: new { @class = "control-label col-md-4" })
          <div class="col-md-8">
               @Html.EditorFor(model => model.ContractNumber, new { htmlAttributes = new { @class = "form-control" } })
               @Html.ValidationMessageFor(model => model.ContractNumber)
          </div>
    </div> [...]
    <input type="submit" value="Update"/>
}

ContractController.cs

@model DocumentViewModel
@using (Html.BeginForm("AddDocument","Contracts", FormMethod.Post, new { @class = "form-horizontal", enctype="multipart/form-data" }))
{
        @Html.AntiForgeryToken()
        @Html.HiddenFor(model => model.IdContract)
        <div class="form-group">
             @Html.LabelFor(model => model.DocHttp, htmlAttributes: new { @class = "control-label col-md-2" })
             <div class="col-md-10">
                  @Html.TextBoxFor(x => x.DocHttp, htmlAttributes: new { @class = "form-control", data_style = "btn-primary", type = "file", multiple = "multiple" })
                  @Html.ValidationMessageFor(model => model.DocHttp)
             </div>
        </div>
        <input type="submit" value="Add"/>
}

首先,问题是,当我提交编辑表单时,自然会调用[HttpPost] Edit方法,还会调用[HttpPost] AddDocument。这是由于使用了Html.Action而不是Html.RenderPartial?

如果我是对的,那么在生成局部视图之前必须进行处理时会调用Html.Action,而Html.RenderPartial只传递参数。

为什么调用[HttpPost] AddDocument方法?谁叫它?

其次,要绕过这个问题,我必须重定向到Edit页面而不是调用View方法。但是,我丢失了输入的数据。我该如何处理这个问题?

感谢。

1 个答案:

答案 0 :(得分:0)

  

[...]还有[HttpPost] AddDocument。这是由于使用了Html.Action而不是Html.RenderPartial?

您可以在视图中包含多个表单,每个表单只会调用相应的控制器方法。

  

如果我是对的,那么在生成局部视图之前必须进行处理时会调用Html.Action,而Html.RenderPartial只传递参数。

选中此post

基本上在调用@html.Partial时,你是在没有控制器调用的情况下导入html的。如果该部分视图是强类型的,则需要确保您正在进行调用的视图的当前模型具有该部分所需的模型。

因为您的部分视图与调用视图模型的模型不同,所以您有两种选择:

1-与解决方案相同,调用操作方法并将模型创建到该视图

2-传递给调用@ Html.renderPartial或@ Html.Partial的视图的模型必须包含partial中需要的模型。 用法示例sh

  

其次,要绕过这个问题,我必须重定向到Edit页面而不是调用View方法。但是,我丢失了输入的数据。我该如何处理这个问题?

重定向之间不会保留数据。

您可以this和/或阅读this