模型中的MVC3数据在发布时设置为null

时间:2012-01-30 19:23:25

标签: asp.net-mvc-3 post razor model null

我现在有一个视图,其中模型是传递到局部视图并在页面上显示为列表的模型列表。部分视图有一个表单,在提交时,应该将模型发送回控制器,在那里它可以将模型重定向到页面以编辑其属性。但是,模型的其中一个数据成员在发布后设置为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 Web.Models.ViewEntryModel

<div class="entryInformation">
    <div class="left">
        <span>@Model.Date.Month/@Model.Date.Day/@Model.Date.Year</span>
    </div>
    <div class="right">
        @using(Html.BeginForm("EditEntry", "UserEntry", Model))
        { 
            <input type="submit" value="Edit" /> 
        } <a>delete</a>
    </div>
    <div class="middle">
        @if (Model.ActivityType.Equals("Exercise"))
        { 
            <span>You completed the <strong>@Model.ActivityName</strong> exercise for <strong>@Model.Answer</strong>.</span>
        }
        else if (Model.ActivityType.Equals("Question"))
        { 
            <span>You answered <strong>@Model.ActivityName</strong> with <strong>@Model.Answer</strong>.</span>
        }
        else if (Model.ActivityType.Equals("Nutrition"))
        { 
            <span>You ate <strong>@Model.Answer</strong> servings of <strong>@Model.ActivityName</strong>.</span>
        }
    </div>
</div>

它发布到

的Controller方法
[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");
    }

当它发布时,model.ActivityModel为null,即使调试它在视图中正确设置。关于可能导致这种情况的任何想法?

1 个答案:

答案 0 :(得分:0)

我认为你在这里要解决一些问题。

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

    ExerciseActivity exerciseActivity = (ExerciseActivity)model.ActivityModel;
    
  2. 看到你如何使用Activity类 - Activity是抽象的吗?如果是这样,那就是绑定系统将其保留为空的原因。

  3. 部分不发布任何Activity属性的属性;尝试添加

    @Html.TextBoxFor(m => m.Activity.Name)
    

    ......或类似的东西;适用于Activity类的任何内容。

  4. 如果您想坚持使用ActivityType / ActivityModel属性,可以根据{{1创建自定义ValueProvider来创建Activity个对象值。或者,您可以为每个ActivityType类型创建专用的ViewEntryModel类型,并将其发布到不同的操作。