我通过两个值搜索数据库:
public class SearchProjectModel : ISearchProject
{
public int ProjectID { get; set; }
[Display(Name = "Project Number")]
public string JobNumber { get; set; }
[Display(Name = "Project Name")]
public string JobName { get; set; }
}
索引视图:
@model SearchProjectModel
@using (@Html.BeginForm("ManipulateProject", "Project", FormMethod.Post))
{
<div>
@Html.HiddenFor(x => x.ProjectID)
<div class="col-md-3">
@Html.LabelFor(x => x.JobNumber)
@Html.TextBoxFor(x => x.JobNumber, new { @class = "form-control", id = "jobNumber" })
@Html.ValidationMessageFor(x => x.JobNumber)
</div>
<div class="col-md-6">
@Html.LabelFor(x => x.JobName)
@Html.TextBoxFor(x => x.JobName, new { @class = "form-control " })
@Html.ValidationMessageFor(x => x.JobName)
</div>
</div>
<div class="col-md-12 text-center" style="margin-top: 1%">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
}
然后,在控制器上,我基于发现的内容创建一个新模型:
public ActionResult ManipulateProject(SearchProjectRequest request)
{
var project = _projectService.GetBy(request);
if (project != null)
{
//When this method is complete the data is in the new model!!!!
return View("Project", Assemble(project));
}
return View("Project", Assemble(new ManipulateProjectModel()));
}
模型:
public class ManipulateProjectModel : IProject
{
public int ProjectID { get; set; }
[Display(Name = "Project Number"), Required(ErrorMessage = "Required!")]
public string JobNumber { get; set; }
[Display(Name = "Project Name"), Required(ErrorMessage = "Required!")]
public string JobName { get; set; }
//Lots of stuff that is being populated
}
项目视图:
@model ManipulateProjectModel
<div>
@using (@Html.BeginForm("Save", "Project", FormMethod.Post))
{
@Html.HiddenFor(x => x.ProjectID)
<div class="col-md-12" style="border: 1px dotted black; padding: 1%; margin-top: 1%">
<h3 class="col-md-12 text-center">Project Info</h3>
<div class="col-md-3">
@Html.LabelFor(x => x.JobNumber)
@Html.TextBoxFor(x => x.JobNumber, new { @class = "form-control", id = "jobNumber"})
@Html.ValidationMessageFor(x => x.JobNumber)
</div>
<div class="col-md-6">
@Html.LabelFor(x => x.JobName)
@Html.TextBoxFor(x => x.JobName, new { @class = "form-control "})
@Html.ValidationMessageFor(x => x.JobName)
</div>
//stuff that is populated just fine
</div>
}
</div>
当找到项目并调用Assemble时,将使用ALL THE DATA填充新模型!但是,如果我仅搜索两个参数之一,则模型中将填充我没有填写的框,但文本框不会显示数据。
为什么填充模型,但视图未填充文本框。它应该不知道或不在乎先前的视图是否已填充。
这是因为html助手使用的值ModelState
,而不是模型的值。当您发布到时public ActionResult ManipulateProject(SearchProjectModel request)
(请注意,我假设它的确是true SearchProjectModel
,不是SearchProjectRequest
),将SearchProjectModel
创建的一个实例,并绑定其属性。值也被添加到中ModelState
。
当您返回带有实例的视图时ManipulateProjectModel
,您的@Html.TextBoxFor(x => x.JobName
)会通过首先查找一个ModelState
值来设置该值。因为第一种形式的值是(say)null
,所以文本框将在发布后显示一个空字符串,因为ModelState
for的值JobName
是null
,尽管您的Assemble()
方法可能将其设置为。在此答案中说明了这种行为的原因。
一种选择是为SearchProjectModel
属性赋予与属性中不同的名称ManipulateProjectModel
。另一个选择是ModelState
在重新分配新值并返回视图之前清除
ModelState.Clear(); // clears all values
// or clear one property
if (ModelState.ContainsKey("JobName"))
{
ModelState["JobName"].Errors.Clear();
}
注意清除模型状态也会删除验证错误,因此请谨慎使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句