ASP.net MVC5 如何取得分部视图对应的模型数据

狐狸大仙 2014-08-20 05:20:16
数据结构是这样的 ModelSetConfig里有多个ModelEntity

public class ModelSetConfig
{
public double TriggerThresholdMark { set; get; }
public decimal ProfitLimitation { set; get; }
public decimal LossLimitation { set; get; }
public List<ModelEntity> ModelList { set; get; }
public ModelSetConfig()
{
ModelList = new List<ModelEntity>();
}
}
public class ModelEntity
{
public string ModelName { set; get; }
public bool? IsMainBuy { set; get; }
}

_ModelSetConfig.cshtml 是一个大的分部视图,在里面根据 ModelList的数量加载子分部视图 _ModelConfig.cshtml

@model BackTestWeb.Models.ModelSetConfig

@using (Html.BeginForm())
{
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">@ViewBag.Title</h3>
</div>
<div class="panel-body container">
<div class="row">
@Html.LabelFor(model => model.TriggerThresholdMark, new { @class = "control-label col-md-1" })
<div class="col-md-2">
@Html.EditorFor(model => model.TriggerThresholdMark)
@Html.ValidationMessageFor(model => model.TriggerThresholdMark)
</div>
@Html.LabelFor(model => model.ProfitLimitation, new { @class = "control-label col-md-1" })
<div class="col-md-2">
@Html.EditorFor(model => model.ProfitLimitation)
@Html.ValidationMessageFor(model => model.ProfitLimitation)
</div>
@Html.LabelFor(model => model.LossLimitation, new { @class = "control-label col-md-1" })
<div class="col-md-2">
@Html.EditorFor(model => model.LossLimitation)
@Html.ValidationMessageFor(model => model.LossLimitation)
</div>
</div>
</div>
@foreach(var modelEnity in @Model.ModelList)
{
@Html.Action("Index", "ModelConfig",modelEnity)
}

<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="添加辅助模型" class="btn btn-default" />
</div>
</div>
</div>
}

在ModelSetConfigController里对ModelList做了一些初始化操作。

public class ModelSetConfigController : Controller
{
//
// GET: /StrategyManage/ModelSetConfig/
public ActionResult Index()
{
ViewBag.Title = "全局参数";

var modelConfig = new ModelSetConfig();

return PartialView("_ModelSetConfig", CreateInitModelSetConfig());
}

[HttpPost]
public ActionResult Index(ModelSetConfig modelSetConfig)
{

modelSetConfig.ModelList.Add(new ModelEntity());
return PartialView("_ModelSetConfig", modelSetConfig);
}
}

画面打开时,一切正常。

现在我需要动态添加 ModelEntity,在分部视图 ModelSetConfig里加了个按钮,按钮点下以后,提交到 [HttpPost] Index 希望能增加一个ModelEntity。

但是在view传递给controller的 modelSetConfig对象中,ModelList为空,其他数据都正常可以取到。

想请教一下,为什么ModelList是空的呢?怎么才能从View取到这些数据呢?
...全文
387 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
狐狸大仙 2014-09-01
  • 打赏
  • 举报
回复
搞定了。原因也研究清楚了,不过我因为还有其他需求,所以最终没有使用分部视图而是全部jquery+knockout搞定。 针对我提出的这个问题,这里记录一下原因。 分部视图的控件的客户端是由模型的名字生成的,比如我这个例子中的 需要对ModelName进行处理: 模型:ModelSetConfig, 生成ID: ModelList[i].ModelName , FormCollection:每个ModelName都有自己对应的名值对 模型:ModelEntity ,生成ID:ModelName ,FormCollection: ModelName = {Name1,Name2,Name3....} 在默认情况下,只有前者才能自动更新模型参数。 有一个特殊例子:就是把分部视图放在 EditorTemplates文件夹里,这样即使传入的是部分模型,但是生成出来的客户端ID也是符合整个模型传入的结果。
狐狸大仙 2014-09-01
  • 打赏
  • 举报
回复
引用 7 楼 qq_19920727 的回复:
@Html.EditorFor(model => model.LossLimitation) 当初学习的时候 我也这样写 不过后来不用了 一直听别人说这样写不推荐 也不知道理由 有人知道么??
原本用 @Html.EditorFor的地方我都改用 @Html.TextBoxFor了。因为Editor上不能附加css信息。
qq_19920727 2014-08-22
  • 打赏
  • 举报
回复
@Html.EditorFor(model => model.LossLimitation) 当初学习的时候 我也这样写 不过后来不用了 一直听别人说这样写不推荐 也不知道理由 有人知道么??
狐狸大仙 2014-08-21
  • 打赏
  • 举报
回复
精炼一下题目。 1. 数据表中一个字段是序列化以后存储的。因此对这个字段编辑的话就需要反序列化,然后在画面上编辑。 2. 因为1中提到的字段里的对象是不定数量的,因此使用分部视图来对应每一个动态对象。 3. 在提交时,需要读取到用户修改过的动态对象,并组合在一起再序列化以后存储到数据库中。 现在卡在第三步,提交时,读取不到用户修改过的动态对象的值。
狐狸大仙 2014-08-21
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
用Html.RenderPartial(参数名, 参数值)传过去。 分布视图定义参数接收。
改用RenderPartial试了一下,get显示是正常的,但是再post过去的数据中,没有分部视图的数据。 能再帮我看看么?
狐狸大仙 2014-08-21
  • 打赏
  • 举报
回复
引用 3 楼 insus 的回复:
看看这个是否有帮助? http://www.cnblogs.com/insus/p/3633298.html
这篇文章里提到的是数据在不同的view上的展示。 我需要的是根据客户在PartialView的修改结果,反映到action上。但是现在post的时候,action上得不到PartialView中设定的数据。
insus 2014-08-21
  • 打赏
  • 举报
回复
看看这个是否有帮助? http://www.cnblogs.com/insus/p/3633298.html
yzf86211861 2014-08-21
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
用Html.RenderPartial(参数名, 参数值)传过去。 分布视图定义参数接收。
这个可以
threenewbee 2014-08-20
  • 打赏
  • 举报
回复
用Html.RenderPartial(参数名, 参数值)传过去。 分布视图定义参数接收。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧