我正在创建一个允许我记录食谱的应用程序。我试图创建一个允许我添加配方基础的视图,例如食谱名称,食谱日期,温度在&使用的成分。
我正在创建一个包含一些jquery的视图来加载部分视图客户端。
在post im上有一些麻烦试图从使用jquery加载的局部视图中获取值。
我的主视图的缩减版本看起来像(我最初想要加载1个局部视图)
<div id="ingredients">
@{ Html.RenderPartial("_AddIngredient", new IngredientViewModel()); }
</div>
<script type="text/javascript">
$(document).ready(function () {
var dest = $("#ingredients");
$("#add-ingredient").click(function () {
loadPartial();
});
function loadPartial() {
$.get("/Recipe/AddIngredient", {}, function (data) { $('#ingredients').append(data); }, "html");
};
});
</script>
我的部分视图看起来像
<div class="ingredient-name">
@Html.LabelFor(x => Model.IngredientModel.IngredientName)
@Html.TextBoxFor(x => Model.IngredientModel.IngredientName)
</div>
<div class="ingredient-measurementamount">
@Html.LabelFor(x => Model.MeasurementAmount)
@Html.TextBoxFor(x => Model.MeasurementAmount)
</div>
<div class="ingredient-measurementtype">
@Html.LabelFor(x => Model.MeasurementType)
@Html.TextBoxFor(x => Model.MeasurementType)
</div>
控制器帖子
[HttpPost]
public ActionResult Create(RecipeViewModel vm,IEnumerable<string>IngredientName, IEnumerable<string> MeasurementAmount, IEnumerable<string> MeasurementType)
{
最后我的viewmodel看起来像
public class IngredientViewModel
{
public RecipeModel RecipeModel { get; set; }
public IEnumerable<IngredientModel> Ingredients { get; set; }
}
我的控制器非常难看......我正在使用Inumerble获取MeasurementAmount和amp;的值。 MeasurementType(IngredientName总是返回null),理想情况下我认为httppost上的所有内容都会填充我可以填充成分
如何将部分视图中的值导入控制器?
答案 0 :(得分:2)
为什么不看看MVC Controlstoolkit
我认为他们会做你想做的事。
答案 1 :(得分:0)
没有太多细节。您可以更改public ActionResult Create
以使用FormCollection而不是视图模型吗?这将允许您查看通过的数据(如果有)。如果你可以发布它会有所帮助。
使用Binding填充您的视图模型 - 如果您还没有阅读过它,那么这样做可能是个好主意。最后,我会考虑将您的列表或枚举包装到单个视图模型中。
答案 2 :(得分:0)
可能出现的问题
问题可能在于您刚刚渲染的新Partial与之后发布的ViewModel没有正确绑定。
如果你用firebug检查元素,那么Partial中的元素应该命名为/ Id'ed,如下所示: Ingredients [x] .Property1,Ingredients [x] .Property2 等< / p>
在你添加部分的情况下,他们可能只被称为 Property1,Property2 。
可能的解决方案
为您的属性提供与您的成分列表对应的正确名称。像这样:
@Html.TextBox("Ingredients[x].Property1","")
在呈现部分之后,只需将ID为jquery的所有名称更改为正确的值。
答案 3 :(得分:0)
这是因为部分视图中的字段名称不适合默认的ModelBinder约定。您应该分析部分视图中字段的名称。
此外,您应该实现将集合绑定到MVC控制器的正确方法。您可以在Phil's Haack post
中找到示例答案 4 :(得分:0)
假设RecipeViewModel是提供给局部视图的模型,请尝试在POST控制器中接受它,如下所示:
[HttpPost]
public ActionResult Create(RecipeViewModel vm)
{
//
}
您应该使用表单中提供的所有值填充模型。