这是常见的情况
我有这些实体
用户
用户ID
用户名
...
UserQuestion
UserQID
用户ID
UserQuestion
UserAnswer
一个用户可以有很多问题,但一个用户可以附加一个问题
在我的示例中,我创建了3个空实体(UserQuestion)。然后我将这些问题附在用户身上。
在视图中,对于每个问题,回答文本框,我使用ElementAt指定每个UserQuestion实体。
为什么我不能保存这3个问题
在控制器中
public ActionResult ChooseQuestion()
{
IUserRepository repUser = new UserRepository(EntityFactory.GetEntity());
User usr = repUser.GetUserByID(Convert.ToInt32(Session["UserID"]));
usr.UserQuestions.Add(new UserQuestion());
usr.UserQuestions.Add(new UserQuestion());
usr.UserQuestions.Add(new UserQuestion());
var ViewModel = new UsrViewModel()
{
UserInfo = usr
};
return View(ViewModel);
}
[HttpPost]
public void ChooseQuestion(User UserInfo)
{
UpdateModel(User, "UserInfo");
EntityFactory.GetEntity().SaveChanges();
}
在我的视图中
<%: Html.TextBoxFor(model => model.UserInfo.UserName)%>
...
<%: Html.TextBoxFor(model => model.UserInfo.LastName%>
...
<%: Html.TextBoxFor(model => model.UserInfo.UserPassword%>
..
<h2>Question Creation</h2>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserAnswer)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(1).UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(1).UserAnswer)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(2).UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(2).UserAnswer)%>
3
答案 0 :(得分:3)
基于Phil Haack's post,你应该在你的名字属性中加上序号,如下所示:
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserQuestion, new {name="UserInfo.UserQuestion0.UserQuestion} )%>
通常情况下,内置的HtmlHelper.TextboxFor方法会在for循环中正确执行name属性。
由于我现在不在我的VS附近,所以我不能为自己尝试这种魔法,但如果你遇到困难,你可能想查看Phil的文章。
答案 1 :(得分:0)
不确定您到底在寻找什么:
似乎你错过了一个问题表:
question
---------
question_id
question_text
然后将其链接到用户
user_question
--------------
user_id
question_id
answer
答案 2 :(得分:0)
错误就是
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(1).UserQuestion)%>
生成HTML代码:
<input id="UserQuestion" name="UserQuestion" type="text" value="UserQuestion" />
<input id="UserQuestion" name="UserQuestion" type="text" value="UserQuestion" />
如您所见:存在相同id
s的输入,这是禁止的。因此,当您将数据发回控制器时,只有一个值通过PostParameters发送:UserQuestion =,没有索引,没有前缀,没有UserQuestions.UserQuestion[0]
。
为了更多地挖掘相似的问题,我建议使用Fiddler并拦截表单发送的流量。
您的代码的第二个问题是您使用的是UpdateModel(User, "UserInfo")
和UserInfo参数(类型为User)。 (顺便说一句:这段代码如何编译?无论如何都不应该)。
调用FormCollection
时,最好使用UpdateModel
作为参数。因为在您的情况下,变量UserInfo
已经更新
至于我,你做的很奇怪,试图编辑整个集合。
答案 3 :(得分:0)
替换代码:
<h2>Question Creation</h2>
<% for (int i = 0; i < Model.UserInfo.UserQuestions.Count; i++) { %>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions[i].UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions[i].UserAnswer)%>
<% } %>
然后至少你的代码是干的。
[HttpPost] public void ChooseQuestion(User UserInfo) { IUserRepository repUser = new UserRepository(EntityFactory.GetEntity()); 用户usr = repUser.GetUserByID(Convert.ToInt32(Session [“UserID”]));
UpdateModel(usr);
EntityFactory.GetEntity().SaveChanges();
}
取决于是否存在问题,这应该有效。
UserInfo对象应该包含您的问题,您可以foreach
将它们添加到手动中。
答案 4 :(得分:0)
看起来您在一个不包含任何更改的新实体上运行SaveChanges,而不是包含客户更新信息的实体。