MVC3传递基类到局部视图 - 提交表单只有父类的值

3

我有许多继承自基本ViewModel类的子ViewModel类。

我将我的子ViewModel传递到视图中,然后再将自己传递到部分视图中。 主视图采用子类型,但部分视图采用父类型。

当我手动填充属性时,一切都正确显示。 然而,当我提交表单时,我的控制器操作只有子类的属性 - 没有完成任何基类属性?

例如:

public abstract class BaseDetails
    {
        public string Name { get; set; }

        public BaseDetails()
        { }

        public BaseDetails(string name)
        {
            Name = name;
        }
    }

    public class LocalDetails:BaseDetails
    {
        public int Visits { get; set; }

        public LocalDetails()
        { }

        public LocalDetails(int visits, string name)
            :base(name)
        {
            Visits = visits;
        }
    }

使用以下简单的视图:

@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Visits)
    <br />
    @Html.Partial("Name", Model)
    <input id="Submit1" type="submit" value="submit" />
}

这个局部视图上只有一个文本框。

在IE中:查看源代码会显示form标签将两个文本框都包含在内。

然而,当我提交到控制器方法时:

[HttpPost]
public ActionResult EditLocal (LocalDetails model)

model.Visits已正确填充,但model.Name为空?

有什么想法吗? 我向类中添加了无参构造函数,因为如果不这样做,我会在提交时收到异常。


仅为澄清:这些只是问题的示例,我的真实类/视图更加复杂。 - BlueChippy
1个回答

7

无法复现。我的工作正常。请注意,我没有在我的视图模型中使用任何构造函数,因为模型绑定器将无法调用它们,并且所有属性必须具有公共的getter和setter。

模型:

public abstract class BaseDetails
{
    public string Name { get; set; }
}

public class LocalDetails : BaseDetails
{
    public int Visits { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new LocalDetails());
    }

    [HttpPost]
    public ActionResult Index(LocalDetails model)
    {
        return View(model);
    }
}

View (~/Views/Home/Index.cshtml):

@model LocalDetails
@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Visits)
    <br />
    @Html.Partial("Name", Model)
    <input type="submit" value="submit" />
}

部分文件(~/Views/Home/Name.cshtml):

@model BaseDetails
@Html.TextBoxFor(x => x.Name)

当我在POST Index动作中提交表单时,模型属性Name和Visits都能正确地绑定来自表单的值。


2
私有 setter 是罪魁祸首 - 从没注意到那个 :( 谢谢 - BlueChippy
提示:我仍然拥有所有的构造函数(无参数和有参数),这并不会引起任何问题...是私有设置器给我带来了麻烦! - BlueChippy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接