提交ajax表单时,MVC 5模型属性为null

时间:2014-11-16 05:49:45

标签: jquery ajax asp.net-mvc-5

我创建一个模型并将其传递给局部视图。当我提交模型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访问值,但我无法将它们放入我的模型中。有什么想法让我的模型不能正确填充?

2 个答案:

答案 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属性,那么模型绑定器将成功映射和替换模型中的值。