[英]Posting a view that contains multiple partial views
我在使用一个提交按钮发布包含多个部分视图的视图时遇到问题
这是我的A型号,
:更新:
public class AModel
{
public int AID { get; set; }
public int BID { get; set; }
public int CID { get; set; }
public int ANumber { get; set; }
public BModel BModel { get; set; }
public CModel CModel { get; set; }
}
这是我的B型号
public class BModel
{
public int BID { get; set; }
public int BName { get; set; }
public IList<DModel> DModel { get; set; }
}
这是D模型
public class DModel
{
public int DID { get; set; }
public int? Number { get; set; }
}
这是c模型
public class CModel
{
public int CID { get; private set; }
public IList<HModel> HModels { get; set; }
}
等等这是主要观点
@model Project.Web.Models.AModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.Partial("CreateB",Model.BModel);
@Html.Partial("CreateC",Model.CModel);
<input style="border-radius:4px;width:100px;" type="button" value="next" id="next" class="btn btn-default" />
}
这是Get动作
public ActionResult Create(){
Models.AModel model = new Models.AModel(){
BModel = new BModel(){
DModel = new List<Models.DModel>(){ new Models.DModel() },
CModel = new CModel(){
HModel = new List<HModel>(){ new Models.HModel() },
};
return View(model);
}
这是Post的动作
[HttpPost]
public ActionResult Create(Models.AModel model)
{
//doing things with data
//when I reach this point all object are null
return RedirectToAction("index", model);
}
public void SetNumber(Models.BModel model){
model.DModel.Add(new Models.DModel());
}
部分视图对于BModel,CModel类似于BModel部分视图注意:SetNumber方法仅创建一个新对象并将其添加到列表中
@model Project.Web.Models.BModel
@Html.TextBoxItemFor(x => x.BName)
@for ( int i=0; i< Model.DModel.Count; i++){
@Html.TextBoxItemFor( x => x.DModel[i].Number)
<a id="addNumber" href="/AController/SetNumber/" data-ajax="true" data-
ajax-method="GET" >Add Another Number</a>
}
我能做什么? 我错过了什么?
很高兴看到你的部分。 您应该记住将这些部分名称(作为主模型的属性)也放到输入的“名称”属性中。 因此,对于您的情况,您的PartialView应包含以下输入: <input name="AModel.BModel.BID" ... />
更新:
尝试更换你的
@Html.Partial("Name", Model.PartialModel)
至
@{ Html.RenderPartial("Name", Model.PartialModel, new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = prefix } }); }
其中prefix
是Model属性名称(持有该部分模型,ex“BModel”)。 因此,您对AModel的看法如下所示:
@model Project.Web.Models.AModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@{ Html.RenderPartial("CreateB",Model.BModel, new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "BModel" } }) }
@{ Html.RenderPartial("CreateC",Model.CModel, new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "CModel" } })
<input style="border-radius:4px;width:100px;" type="button" value="next" id="next" class="btn btn-default" />
}
更新2:
为了使用数组(您在BModel中有),您需要稍微修改一下这个前缀,因此BModel的视图将包含:
@{
for (var i = 0; i < Model.DModel.Count(); i++)
{
Html.RenderPartial("Name", Model.DModel[i], new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "DModel["+i+"]" } });
}
}
更新3:
这是一个完整的例子,适用于没有JavaScript的情况(或非常类似于你)。 控制器:
public ActionResult Test()
{
return View("Test1", new AModel());
}
[HttpPost]
public ActionResult Save(AModel model)
{
if (model.PostType == "Add")
{
model.BModel.DModels.Add(new DModel());
return View("Test1", model);
}
// Do something with this final model
return View("Test1");
}
楷模:
public class DModel
{
public string Name { get; set; }
}
public class CModel
{
public string SomeName { get; set; }
}
public class BModel
{
public List<DModel> DModels { get; set; }
public BModel()
{
DModels = new List<DModel>();
}
}
public class AModel
{
public BModel BModel { get; set; }
public CModel CModel { get; set; }
public string PostType { get; set; }
public AModel()
{
BModel = new BModel();
CModel = new CModel();
}
}
AModel查看:
@model MVC.Models.AModel
@if (Model == null)
{
<span>Model saved</span>
}
else
{
using (Html.BeginForm("Save", "Home", FormMethod.Post))
{
Html.RenderPartial("Partials/CModel", Model.CModel, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "CModel" } });
<hr />
Html.RenderPartial("Partials/BModel", Model.BModel, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "BModel" } });
<input type="submit" name="PostType" value="Add"/><br />
<input type="submit" name="PostType" value="Save"/>
}
}
BModel局部视图:
@model MVC.Models.BModel
@{
for (var i = 0; i < Model.DModels.Count(); i++)
{
Html.RenderPartial("Partials/DModel", Model.DModels[i], new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = $"{ViewData.TemplateInfo.HtmlFieldPrefix}.DModels[{i}]" } });
}
}
DModel局部视图:
@model MVC.Models.DModel
Name: @Html.EditorFor(x => x.Name) <br/>
CModel局部视图:
@model MVC.Models.CModel
SomeName: @Html.EditorFor(x => x.SomeName) <br/>
如果你可以使用jQuery,那么这两个提交输入可以被一些按钮和onclick
事件处理程序替换,这些处理程序将采用当前形式并发布到控制器上的不同操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.