【问题标题】:MVC3 passing base class to partial View - submitting form only has parent class valuesMVC3 将基类传递给部分视图 - 提交表单只有父类值
【发布时间】:2011-09-09 14:01:58
【问题描述】:

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

我将我的子 ViewModel 传递到我的 View 中,然后将其自身传递到局部视图中。 主视图采用子类型,而局部视图采用父类型。

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

例如

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;
        }
    }

View 这么简单:

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

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

在 IE 中:ViewSource 显示表单标签在两个 tetxbox 周围。

但是,当我提交给控制器方法时:

[HttpPost]
public ActionResult EditLocal (LocalDetails model)

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

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

【问题讨论】:

  • 只是为了澄清:这些是问题的例子,我真正的类/视图更复杂。

标签: asp.net-mvc-3 viewmodel base-class


【解决方案1】:

无法重现。对我来说很好。请注意,我没有在视图模型中使用任何构造函数,因为模型绑定器无法调用它们,并且所有属性都必须具有公共 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);
    }
}

查看(~/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 都与表单中的值正确绑定。

【讨论】:

  • 私人二传手是罪魁祸首 - 从来没有发现:( Thx
  • 供参考:我仍然拥有我所有的 ctor(无参数和其他),这不会导致任何问题......这是为我做的私人二传手!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多