我有这个型号:
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。
答案 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
,以便在发布时知道将其插入到模型中。