ASP.NET MVC 4表单post变量在接收控制器中为null

时间:2013-12-09 16:57:29

标签: c# asp.net-mvc forms asp.net-mvc-4 post

我有这个型号:

  public class WorkflowImport {
    public bool IsLive { get; set; }
    public string DateTimeCreated { get; set; }
    public string CreatedByUser { get; set; }
    public string VersionComments { get; set; }
    public string VersionNumber { get; set; }
    public string FilePath { get; set; }

    public List<WorkflowProcess> WorkflowProcesses { get; set; }
  }

局部视图:

@model <FullyQualifiedPathTo...>.ViewModels.WorkflowImport

<div class="subSectionHeader">Upload New Workflow Profile</div>
<div class="AccountDetailLine">
  @using ( Html.BeginForm( "UploadNewMatrix", "Home", FormMethod.Post, new { enctype = "multipart/form-data" } ) ) {
    <table>
      <tr>
        <td>Select Local File:</td>
        <td>
          <div class="upload-wrapper">
            <input type="file" name="file" id="xlsfile" />
          </div>
        </td>
      </tr>
      <tr>
        <td>Version Comments:</td>
        <td>
          @Html.TextBox( "comments", Model.VersionComments, new Dictionary<string, object> { { "class", "textboxUploadField" } } )
        </td>
      </tr>
      <tr>
        <td>Version Number:</td>
        <td>
          @Html.TextBox( "version", Model.VersionNumber, new Dictionary<string, object> { { "class", "textboxUploadField" } } )
        </td>
      </tr>
      <tr>
        <td colspan="2"></td>
      </tr>
      <tr>
        <td>Select whether this file upload will update<br />
          the live workflow matrix or just the "What If" test matrix</td>
        <td>LIVE @Html.RadioButtonFor( model => model.IsLive, "True" )
          "What If" @Html.RadioButtonFor( model => model.IsLive, "False" )
        </td>
      </tr>
    </table>
    <div class="submit-wrapper">
      <input type="submit" value="Import Now" id="form_submit" class="ovobutton" />
    </div>
  }
</div>

和接收控制器/方法:

public class HomeController: Controller {
    // POST /Home/UploadNewMatrix
    [HttpPost]
    public ActionResult UploadNewMatrix( WorkflowImport workflowImport ) {
      return View( workflowImport );
    }
}

但是当我在两个文本框中输入一些值并单击提交按钮时,在检入调试器时,我在控制器的绑定对象中得到空值。

我不知道为什么会这样,因为我在之前的项目中使用了几乎相同的模式(包括带有“multipart / form-data”的文件上传),并且能够成功获得这些值。

有什么明显的东西我没见过吗?这个新应用程序与之前的应用程序之间的区别在于它是很多jquery中的局部视图,但我不知道它是如何产生影响的。此外,我需要使用传统的文件上传,因为目标浏览器是IE8,不支持HTML5。

2 个答案:

答案 0 :(得分:5)

为了正确绑定,name html元素必须等于属性名称

属性:

  public string VersionComments { get; set; }

查看:

   <tr>
        <td>Version Comments:</td>
        <td>
          @Html.TextBox("VersionComments", Model.VersionComments, new Dictionary<string, object> { { "class", "textboxUploadField" } } )
        </td>
      </tr>

注意:我同意雅各布。使用@Html.EditorFor(m=>m.VersionComments)更灵活的方法,但我的例子展示了绑定原则。

答案 1 :(得分:1)

由于输入的name与模型绑定器所期望的不匹配,因此您返回null。为了帮助您创建正确的名称,ASP.NET MVC有一些有用的帮助方法。而不是:

@Html.TextBox(
    "comments", 
    Model.VersionComments, 
    new Dictionary<string, object> { { "class", "textboxUploadField" } } )

......改为:

@Html.TextBoxFor(
    m => m.VersionComments, 
    new Dictionary<string, object> { { "class", "textboxUploadField" } } )

这将使用VersionComments的值,它还会为输入提供名称VersionComments,以便在发布时知道将其插入到模型中。