2013-12-09 75 views
1

我有這樣的模型:ASP.NET MVC 4形成交變量是空在接收控制器

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); 
    } 
} 

但是,當我輸入一些值到兩個文本框,然後點擊提交按鈕,我在上綁定的對象得到空值控制器,當在調試器中檢查。

我不知道爲什麼發生這種情況,因爲我用幾乎相同的模式(包括「多/表單數據」文件上傳)在以前的項目,並能夠成功獲取值。

有沒有什麼明顯的我在這裏沒有看到?這個新應用程序和以前的區別在於,它是jQuery中的一個局部視圖,但我不明白這會如何改變。另外,我需要使用傳統的文件上傳,因爲目標瀏覽器是IE8,不支持HTML5。

回答

4

對於正確的綁定,名字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)更靈活的方法,但我的例子演示了綁定原理。

+0

這工作,但如果你通過重命名它重構'VersionComments',你也不得不更新字符串「VersionComments」。 '{Input} For'方法更易於維護。 – Jacob

1

你找回null,因爲輸入端的name不匹配的內容模型綁定的期望。爲了幫助您創建正確的名稱,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使其知道堵塞該進發布時的模型。