我创建一个模型并将其传递给局部视图。当我提交模型ModelStat.IsValid为true时,无论我在表单上输入什么值,其属性都为null。
控制器和型号
public class TestController : Controller
{
// GET: Test
public ActionResult Index()
{
TestModel model = new TestModel();
model.SomeFieldName= "Test";
model.OtherFieldName = "AnotherTest";
return PartialView(model);
}
[HttpPost]
public PartialViewResult Index(TestModel model)
{
if(ModeState.IsValid)
{
//Do Stuff to model
}
return PartialView(model);
}
public class TestModel
{
[Required]
public string SomeFieldName;
[Required]
public string OtherFieldName;
}
}
部分视图
@model Portal.Controllers.TestController.TestModel
@using (Ajax.BeginForm("Index", new AjaxOptions { UpdateTargetId = "Content" }))
{
@Html.ValidationSummary(true)
<div id="Content">
@Html.LabelFor(model => model.SomeFieldName,"FieldName")
@Html.TextBoxFor(model => model.SomeFieldName)
@Html.LabelFor(model => model.OtherFieldName ,"OtherFieldName")
@Html.TextBoxFor(model => model.OtherFieldName )
<input type="submit" value="Save" class="btn btn-default" />
</div>
}
阅读this post后,我更换了
public PartialViewResult Index(TestModel model){}
与
public PartialViewResult Index(FormCollection model)
{
var val = model["SomeFieldName"];
var otherVal = model["OtherFieldName"];
}
我能够通过FormCollection访问值,但我无法将它们放入我的模型中。有什么想法让我的模型不能正确填充?
答案 0 :(得分:6)
您需要在属性上使用getter和setter
public string SomeFieldName { get; set; }
public string OtherFieldName { get; set; }
由于您的方法签名为public PartialViewResult Index(TestModel model)
,DefaultModelBinder
初始化TestModel
的新实例,然后尝试根据发布的值设置其属性的值,但不能这样做因为您的属性没有setter。
答案 1 :(得分:0)
您需要按如下方式修改模型类
public class TestModel
{
[Required]
public string SomeFieldName {get; set;}
[Required]
public string OtherFieldName {get; set;}
}
现在为什么它使用FormCollection而不是测试模型。
当您要求formcollection时,您将获得提交给post方法的所有表单字段,这就是您可以访问表单中所有字段的原因。
当你提到特定的类TestModel时,我们知道的是模型绑定,它会尝试将提交的值与模型中的属性进行映射。标记单词属性,因为属性将具有get和set方法。如果找到set属性,那么模型绑定器将成功映射和替换模型中的值。