Asp.net mvc 3 过帐时模型中的MVC3数据设置为空

Asp.net mvc 3 过帐时模型中的MVC3数据设置为空,asp.net-mvc-3,post,razor,model,null,Asp.net Mvc 3,Post,Razor,Model,Null,我现在有一个视图,其中模型是一个模型列表,这些模型被传递到局部视图中,并在页面上显示为列表。部分视图有一个表单,提交时,该表单应将模型发送回控制器,控制器可将模型重定向到页面以编辑其属性。然而,模型的一个数据成员在发布后被设置为null,我不知道为什么。以下是我正在使用的影响程序这一部分的代码: 模型 public class ViewEntryModel { #region properties public long ActivityID { get; set; }

我现在有一个视图,其中模型是一个模型列表,这些模型被传递到局部视图中,并在页面上显示为列表。部分视图有一个表单,提交时,该表单应将模型发送回控制器,控制器可将模型重定向到页面以编辑其属性。然而,模型的一个数据成员在发布后被设置为null,我不知道为什么。以下是我正在使用的影响程序这一部分的代码:

模型

public class ViewEntryModel
{
    #region properties

    public long ActivityID { get; set; }
    public Activity ActivityModel { get; set; }
    public string ActivityType { get; set; }
    public DateTime Date { get; set; }
    public string ActivityName { get; set; }
    public string Answer { get; set; }

    #endregion

}
大体上

<ul id="all_entries">
@foreach (var entry in Model)
{
    <div id="@String.Format("entry{0}", entry.ActivityID)">@Html.Partial("UserEntryRow", entry)</div>
}

当它发布时,model.ActivityModel为null,即使在调试时在视图中正确设置了它。你知道是什么导致了这种情况吗?

我想你有一些问题需要解决

ViewEntryModel.ActivityModel被声明为Activityl类型,因此绑定系统将尝试将其创建为该类的实例。因此,该行将始终失败:

ExerciseActivity exerciseActivity = (ExerciseActivity)model.ActivityModel;
看看你是如何使用活动类的——活动是抽象的吗?如果是这样,这就是绑定系统将其保留为null的原因

分部不发布活动属性的任何属性;尝试添加

@Html.TextBoxFor(m => m.Activity.Name)
…或类似的东西;任何适合活动类的内容


如果要继续使用ActivityType/ActivityModel属性,可以创建自定义值提供程序,以基于ActivityType值创建活动对象。或者,您可以为每个活动类型创建专用的ViewEntryModel类型,并将它们发布到不同的操作。

ActivityModel只是属性名称;我知道这很尴尬,但最初它是活动,我改变了它,以防搞砸MVC。Activity是抽象的,但当我修复了它并用它的子类ExerciseActivity替换它时,属性值仍然返回null。绑定系统要求所有模型类型都是公共的,并且使用公共的、无参数的构造函数是非抽象的。ExerciseActivity是否符合该描述?测试返回内容的一种方法是将ViewEntryModel模型替换为FormCollection表单。这是一个通用字典集合,因此您可以验证正在发回服务器的密钥,并确保它们是正确的。
[HttpPost]
    [Authorize(Roles = "User")]
    public ActionResult EditEntry(ViewEntryModel model)
    {
        if (model.ActivityType.Equals("Exercise"))
        {
            ExerciseActivity exerciseActivity = (ExerciseActivity)model.ActivityModel;
            return RedirectToAction("LogPastExerciseActivity", "UserDashboard", exerciseActivity);
        }

        return RedirectToAction("Index");
    }
ExerciseActivity exerciseActivity = (ExerciseActivity)model.ActivityModel;
@Html.TextBoxFor(m => m.Activity.Name)