问题解答:
- 您不应该将responseId传递给partial,而应该将来自响应对象的备忘录集合传递并使您的partial视图强类型化到该集合。
- 请参见下面的完整代码示例。
- 由于您正在进行简单的ajax调用以添加新备忘录,因此您不需要在partial中使用表单。请参见下面的完整代码示例。
这是我目前正在工作的项目的修改示例:
以下是一些代码:
这是我的模型。职业规划表上有几个部分,其中之一是选择和更新能力的部分。SelectCompetencies模型中包含了一组能力。用户将能够添加能力。当他们这样做时,它将被添加到数据库中,并将更新partial中的能力列表。
public class CareerPlanningFormViewModel
{
public SelectCompetenciesModel SelectCompetencies { get; set; }
}
public class SelectCompetenciesModel
{
public int CareerPlanningFormID { get; set; }
public IList<CompetencyModel> Competencies { get; set; }
public byte MaximumCompetenciesAllowed { get; set; }
}
public class CompetencyModel
{
public int CompetencyID { get; set; }
public int? CompetencyOptionID { get; set; }
public string ActionPlan { get; set; }
public IDictionary<int, string> CompetencyOptions { get; set; }
}
职业规划表单的主视图:/Views/CPF/CareerPlanningForm.cshtml
@model MyNamespace.Models.CareerPlanningForm.CareerPlanningFormViewModel
<link rel="stylesheet" href="@Url.Content("~/Content/CreateCPF.css")" />
@using (Html.BeginForm())
SelectCompetencies 部分视图:/Views/CPF/SelectCompetencies.cshtml
用户将填写新的行动计划文本并单击添加能力按钮。
这将通过 AJAX 发布到 CPFController/NewCompetencyTemplate。
@model MyNamespace.Models.CareerPlanningForm.SelectCompetenciesModel
@Html.HiddenFor(m => m.CareerPlanningFormID)
<h3>Select Competencies</h3>
<p class="guidance">
Select up to @Model.MaximumCompetenciesAllowed competencies to focus on improving.
</p>
<table id="CompetenciesTable">
<thead>
<tr>
<th>Competency</th>
<th>Action Plan:</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.Competencies.Count(); i++)
</tbody>
<tfoot id="CompetenciesTableFooter" class="@(Model.Competencies.Count() < Model.MaximumCompetenciesAllowed ? "" : "hidden")">
<tr>
<td colspan="2">
@Html.TextArea("NewActionPlanText")
@Html.Button(ButtonType.Button, "Add Another Competency", "add", new )
</td>
</tr>
</tfoot>
</table>
@section script
,
dataType: 'html',
success: function (data)
});
});
});
</script>
}
Views/CPF/EditorTemplates/CompetencyModel.cshtml
@model MyNamespace.Models.CareerPlanningForm.CompetencyModel
<tr class="competency">
<td>
@Html.DropDownListFor(m => m.CompetencyOptionID, new SelectList(Model.CompetencyOptions, "Key", "Value"), "Select competency...")
</td>
<td>
@Html.TextAreaFor(m => m.ActionPlan, new )
@Html.HiddenFor(m => m.CompetencyID)
</td>
</tr>
包含添加新能力的操作的控制器:/Controllers/CPFController.cs
这将调用CareerPlanningFormService来添加新能力,并返回一个部分视图NewCompetencyTemplate,以呈现新能力。
public class CPFController : Controller
{
private readonly ICareerPlanningFormService careerPlanningFormService;
public CPFController(ICareerPlanningFormService careerPlanningFormService)
{
this.careerPlanningFormService = careerPlanningFormService;
}
[HttpPost]
public PartialViewResult NewCompetencyTemplate(int careerPlanningFormID, int itemCount, string newActionPlanText)
{
var count = itemCount + 1;
var model = new SelectCompetenciesModel
{
Competencies = Enumerable.Repeat<CompetencyModel>(null, count).ToList()
};
model.Competencies[count - 1] = this.careerPlanningFormService.BuildNewCompetencyModel(careerPlanningFormID, newActionPlanText);
return this.PartialView(model);
}
}
我的服务类: CareerPlanningFormService.cs
该类处理业务逻辑并调用存储库将项目添加到数据库,并返回一个新的能力模型(CompetencyModel)
public class CareerPlanningFormService : ICareerPlanningFormService
{
private readonly IMyRenamedRepository repository;
private readonly IPrincipal currentUser;
public CareerPlanningFormService(
IMyRenamedRepository repository,
IPrincipal currentUser)
{
this.repository = repository;
this.currentUser = currentUser;
}
public CompetencyModel BuildNewCompetencyModel(int careerPlanningFormID, string newActionPlanText)
{
var competency = new Competency
{
CareerPlanningFormID = careerPlanningFormID,
CompetencyOptionID = null,
ActionPlan = newActionPlanText
};
this.repository.Add(competency);
this.repository.Commit();
return new CompetencyModel
{
CompetencyID = competency.CompetencyID,
CompetencyOptionID = competency.CompetencyOptionID,
ActionPlan = competency.ActionPlan,
CompetencyOptions = this.GetCompetencyOptionsForCareerPlanningFormID(careerPlanningFormID)
};
}
}
现在,NewCompetencyTemplate的局部视图文件是:Views/CPF/NewCompetencyTemplate.cshtml
这非常简单,它只是渲染与上面相同的编辑器模板,用于集合中的最后一个能力(我们刚刚添加)。
@model MyNamespace.Models.CareerPlanningForm.SelectCompetenciesViewModel
@Html.EditorFor(m => m.Competencies[Model.Competencies.Count() - 1])
当ajax调用成功时,它将从所调用的控制器动作方法接收此部分。然后,它将取得的部分附加到能力表格主体中。
// snippet from ajax call above
competenciesTableBody.append(elements);
我希望这可以帮到你。如果你有任何其他问题,请告诉我。