如何同时将模型和文件传递给控制器​​?

时间:2014-06-02 19:21:27

标签: asp.net-mvc asp.net-mvc-4

我的MVC项目中有报告模型。现在我必须同时向控制器发送文件。我使用HttpPostedFileBase作为我的报告模型的参数。 报告模型是:

  Public Class ReportsModel
    Public Sub New()
        Authentication = "private"
    End Sub

    Private UploadDate_ As String

    <Display(Name:="ID")> _
    Public Property id As UInteger

    <Display(Name:="Serial Number")> _
    Public Property Srno As UInteger

    <Display(Name:="User Name")> _
    Public Property UserName As String

    <Display(Name:="Details")> _
    Public Property Details As String
  End Class

我的控制器是:

<HttpPost()> _
<AllowAnonymous()> _
<ValidateAntiForgeryToken()> _
Public Function EditReport(ByVal mdl As ReportsModel, ByVal FileUpl As HttpPostedFileBase ) As ActionResult

    Return View(mdl)
End Function

这是我的观点:

<% Using Html.BeginForm() %>
    <%: Html.AntiForgeryToken() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>ReportsModel</legend>
        <%: Html.HiddenFor(Function(model) model.id) %>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Srno) %>
        </div>
         <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Srno) %>
            <%: Html.ValidationMessageFor(Function(model) model.Srno) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.UserName) %>
        </div>
         <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.UserName) %>
            <%: Html.ValidationMessageFor(Function(model) model.UserName) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Details) %>
        </div>
         <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Details) %>
            <%: Html.ValidationMessageFor(Function(model) model.Details) %>
        </div>

          <%--This Code Below is running correctly on passing it , But not with Reports Model--%>

        <form action="/phed/EditReport" method="post" enctype="multipart/form-data">
            <label for="FileUpl1">Upload File: </label>
            <input type="file" name="FileUpl" id="FileUpl" />
            <span style="color: red;"><%:TempData("Message")%></span>


        <p>
            <input type="submit" value="Save" />
        </p>
            </form>
    </fieldset>
<% End Using %>

如何将此FileUpl与ReportsModel一起发送到控制器? 我无法更改报告模型。

2 个答案:

答案 0 :(得分:0)

我明白了。我已将表单操作和enctype更改为&#34; multipart / form-data&#34;。喜欢:

<div>
        <form action="/phed/EditReport" method="post" enctype="multipart/form-data">
             <%: Html.AntiForgeryToken() %>
             <%: Html.ValidationSummary(True) %>
               <fieldset>
        <legend>ReportsModel</legend>

        <%: Html.HiddenFor(Function(model) model.id) %>
        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Details) %>
        </div>
         <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Details) %>
            <%: Html.ValidationMessageFor(Function(model) model.Details) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.BillsOfMonth) %>
        </div>
         <div class="editor-field">
            <%: Html.TextBox("BillsOfMonth", Model.BillsOfMonth, New With {Key .class = "monthpicker"})%>
            <%: Html.ValidationMessageFor(Function(model) model.BillsOfMonth) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.UplDate) %>
        </div>

         <div class="editor-field">
             <%: Html.TextBox("UplDate", Model.UplDate, New With {Key .class = "datepicker"})%>
             <%: Html.ValidationMessageFor(Function(model) model.UplDate) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Authentication) %>
        </div>
         <div class="editor-field">
               <%: Html.DropDownList("Authentication", New List(Of SelectListItem) From { _
                            New SelectListItem With {.Text = "public", .Value = "public"}, _
                         New SelectListItem With {.Text = "private", .Value = "private"}})%>
             <%: Html.ValidationMessageFor(Function(model) model.Authentication) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Download) %>
        </div>
         <div class="editor-field">
            <%: Html.TextBoxFor(Function(model) model.Download, New With {Key .readonly = "readonly"})%>
            <%: Html.ValidationMessageFor(Function(model) model.Download) %>

        </div>
            <label for="FileUpl1">Upload File: </label>
            <input type="file" name="FileUpl" id="FileUpl" />
            <span style="color: red;"><%:TempData("Message")%></span>

          <input type="submit" class="sort-submit" value="Upload File" />

             </fieldset>
        </form>
    </div>

答案 1 :(得分:0)

您似乎创建了一个嵌套到另一个表单的表单,这在HTML中是不允许的,因此如果您要上传文件,则必须删除第二个FormBeginForm方法呈现将由控制器操作方法处理的表单。 您可以在using块中使用此方法。在这种情况下,该方法在使用块的末尾呈现结束标记。 你可以这样做:

  <% Using Html.BeginForm("EditReport","phed",Nothing,FormMethod.Post, New With {.enctype="multipart/form-data"}) %>
   <%: Html.AntiForgeryToken() %>
   <%: Html.ValidationSummary(True) %>
   <fieldset>
     <legend>ReportsModel</legend>
      <%: Html.HiddenFor(Function(model) model.id) %>

      <div class="editor-label">
        <%: Html.LabelFor(Function(model) model.Srno) %>
      </div>
     <div class="editor-field">
        <%: Html.EditorFor(Function(model) model.Srno) %>
        <%: Html.ValidationMessageFor(Function(model) model.Srno) %>
     </div>

    <div class="editor-label">
        <%: Html.LabelFor(Function(model) model.UserName) %>
    </div>
     <div class="editor-field">
        <%: Html.EditorFor(Function(model) model.UserName) %>
        <%: Html.ValidationMessageFor(Function(model) model.UserName) %>
    </div>

    <div class="editor-label">
        <%: Html.LabelFor(Function(model) model.Details) %>
    </div>
     <div class="editor-field">
        <%: Html.EditorFor(Function(model) model.Details) %>
        <%: Html.ValidationMessageFor(Function(model) model.Details) %>
    </div>

      <%--This Code Below is running correctly on passing it , But not with Reports Model--%>

        <label for="FileUpl1">Upload File: </label>
        <input type="file" name="FileUpl" id="FileUpl" />
        <span style="color: red;"><%:TempData("Message")%></span>


      <p>
        <input type="submit" value="Save" />
      </p>
     </fieldset>
  <% End Using %>

我希望它会有所帮助。