我现在有一个视图,其中模型是传递到局部视图并在页面上显示为列表的模型列表。部分视图有一个表单,在提交时,应该将模型发送回控制器,在那里它可以将模型重定向到页面以编辑其属性。但是,模型的其中一个数据成员在发布后设置为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,即使调试它在视图中正确设置。关于可能导致这种情况的任何想法?
答案 0 :(得分:0)
我认为你在这里要解决一些问题。
ViewEntryModel.ActivityModel
被声明为类型Activityl
,因此绑定系统将尝试将其创建为该类的实例。因此,这一行总是会失败:
ExerciseActivity exerciseActivity = (ExerciseActivity)model.ActivityModel;
看到你如何使用Activity
类 - Activity
是抽象的吗?如果是这样,那就是绑定系统将其保留为空的原因。
部分不发布任何Activity
属性的属性;尝试添加
@Html.TextBoxFor(m => m.Activity.Name)
......或类似的东西;适用于Activity
类的任何内容。
如果您想坚持使用ActivityType
/ ActivityModel
属性,可以根据{{1创建自定义ValueProvider
来创建Activity
个对象值。或者,您可以为每个ActivityType
类型创建专用的ViewEntryModel
类型,并将其发布到不同的操作。